• 【头条】造风扇技术那家强,码农为自己的翔代言


    码农自己制作小风扇,妈妈再也用不担心我们夏天晚上被热醒了。

    简要描述: 
    硬件线路连接=>硬件编程=>软件编程  

    实现功能 :  
    1、红外线遥控板 控制风扇开关 挡速
    2、液晶显示器 显示风扇的工作情况
    3、客户端 显示风扇工作情况
    4、开启风扇时 记录上次的挡速 关键技术:         1、硬件中断         2、红外线通信         3、串口通信         4、FALSE存储
     
    硬件截图:
      图片
       图片
       
    客户端软件截图:
     
        
     
    硬件编程源码:
     
     
      1 /********************************************************************
      2 * 文件名  : FanServer.c
      3 * 创建人  : wu_zhuojun,2014年2月23日 北京
      4 * 版本号  : 3.0
      5 ***********************************************************************/
      6  
      7 #include <reg51.h>
      8 #include <intrins.h>
      9  
     10 #define uchar unsigned char
     11 #define uint  unsigned int
     12  
     13 uchar LCD_ID_1[16] = {"I have a dream!"};
     14 uchar LCD_ID_2[16] = {"Speed: 0"};
     15  
     16 void delay(uchar x);  //x*0.14MS
     17 void delay1(int ms);
     18 void beep();
     19  
     20 sbit IRIN = P3^3;         //红外接收器数据线
     21 sbit BEEP = P1^5;         //蜂鸣器驱动线
     22 sbit RELAY= P1^4;         //继电器驱动线
     23  
     24 uchar IRCOM[7];
     25  
     26 sbit E=P2^7;     //1602使能引脚
     27 sbit RW=P2^6;     //1602读写引脚
     28 sbit RS=P2^5;     //1602数据/命令选择引脚
     29  
     30 //==========直流电机参数定义 begin
     31 sbit PWM = P1^0;     //定义直流电机的控制端口
     32 uchar PWM_ON = 0 ;     //风扇档数
     33 //==========直流电机参数定义 end
     34  
     35  
     36 //==========FLASH参数定义 begin
     37 sbit scl=P1^5;  //24c08 SCL
     38 sbit sda=P3^6;  //24c08 SDA
     39 //==========FLASH参数定义 End
     40  
     41 /********************************************************************
     42 * 名称 : delay()
     43 * 功能 : 延时,延时时间大概为140US。
     44 * 输入 : 无
     45 * 输出 : 无
     46 ***********************************************************************/
     47 void Delay2()
     48 {
     49 int i,j;
     50 for(i=0; i<=10; i++)
     51 for(j=0; j<=2; j++)
     52 ;
     53 }
     54  
     55  
     56 /********************************************************************
     57 * 名称 : enable(uchar del)
     58 * 功能 : 1602命令函数
     59 * 输入 : 输入的命令值
     60 * 输出 : 无
     61 ***********************************************************************/
     62 void enable(uchar del)
     63 {
     64 P0 = del;
     65 RS = 0;
     66 RW = 0;
     67 E = 0;
     68 Delay2();
     69 E = 1;
     70 Delay2();
     71 }
     72  
     73 /********************************************************************
     74 * 名称 : write(uchar del)
     75 * 功能 : 1602写数据函数
     76 * 输入 : 需要写入1602的数据
     77 * 输出 : 无
     78 ***********************************************************************/
     79 void write(uchar del)
     80 {
     81 P0 = del;
     82 RS = 1;
     83 RW = 0;
     84 E = 0;
     85 Delay2();
     86 E = 1;
     87 Delay2();
     88 }
     89  
     90 /********************************************************************
     91 * 名称 : L1602_init()
     92 * 功能 : 1602初始化,请参考1602的资料
     93 * 输入 : 无
     94 * 输出 : 无
     95 ***********************************************************************/
     96 void L1602_init(void)
     97 {
     98 enable(0x01);
     99 enable(0x38);
    100 enable(0x0c);
    101 enable(0x06);
    102 enable(0xd0);
    103 }
    104  
    105 /********************************************************************
    106 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
    107 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
    108 L1602_char(1,5,'b')
    109 * 输入 : 行,列,需要输入1602的数据
    110 * 输出 : 无
    111 ***********************************************************************/
    112 void L1602_char(uchar hang,uchar lie,char sign)
    113 {
    114 uchar a;
    115 if(hang == 1) a = 0x80;
    116 if(hang == 2) a = 0xc0;
    117 a = a + lie - 1;
    118 enable(a);
    119 write(sign);
    120 }
    121  
    122 /********************************************************************
    123 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
    124 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    125 L1602_string(1,5,"ab cd ef;")
    126 * 输入 : 行,列,需要输入1602的数据
    127 * 输出 : 无
    128 ***********************************************************************/
    129 void L1602_string(uchar hang,uchar lie,uchar *p)
    130 {
    131 uchar a;
    132 if(hang == 1) a = 0x80;
    133 if(hang == 2) a = 0xc0;
    134 a = a + lie - 1;
    135 enable(a);
    136 while(1)
    137 {
    138 if(*p == '') break;
    139 write(*p);
    140 p++;
    141 }
    142 }
    143  
    144 /********************************************************************
    145 * 名称 : Com_Init()
    146 * 功能 : 初始化串口程序,晶振11.0592, 波特率9600
    147 * 输入 : 无
    148 * 输出 : 无
    149 ***********************************************************************/
    150 void Com_Init(void)
    151 {
    152 TMOD = 0x20;
    153 PCON = 0x00;
    154 SCON = 0x50;
    155 TH1 = 0xFd;
    156 TL1 = 0xFd;
    157 TR1 = 1;
    158 }
    159  
    160 //风扇3档
    161 void PWM_Speed3()
    162 {
    163 static uchar status = 0;
    164 if(10 > status)
    165 {
    166 PWM = 1;//风扇转
    167 }
    168 else//(1000 == status)
    169 {
    170 PWM = 0;//风扇不转
    171 status = 0;
    172 } 
    173  
    174 status++;
    175 }
    176  
    177 //风扇2档
    178 void PWM_Speed2()
    179 {
    180 static uchar status = 0;
    181 if(4 > status)
    182 {
    183 PWM = 1;//风扇转
    184 }
    185 else//(1000 == status)
    186 {
    187 PWM = 0;//风扇不转
    188 status = 0;
    189 } 
    190  
    191 status++;
    192 }
    193  
    194 //风扇1档
    195 void PWM_Speed1()
    196 {
    197 static uchar status = 0;
    198 if(0 == status)
    199 {
    200 PWM = 1;
    201 }
    202 else if(1 == status)
    203 {
    204 PWM = 1;
    205 }
    206 else //2 == status
    207 {
    208 PWM = 0;
    209 status = 0;
    210 } 
    211 status++;
    212 }
    213  
    214 //风扇0档
    215 void PWM_Speed0()
    216 {
    217 PWM = 0;//风扇不转
    218 }
    219  
    220 /********************************************************************
    221 * 名称 : PWM_Contrl()
    222 * 功能 : 控制风扇的档数
    223 * 输入 : 
    224 * 输出 : 无
    225 ***********************************************************************/
    226 void PWM_Contrl()
    227 {
    228 switch(PWM_ON)
    229 {
    230 case 0:
    231 PWM_Speed0();
    232 break;
    233 case 1:
    234 PWM_Speed1();
    235 break;
    236 case 2:
    237 PWM_Speed2();
    238 break;
    239 case 3:
    240 PWM_Speed3();
    241 break;
    242 default:
    243 PWM_Speed0();
    244 break;
    245 }
    246 }
    247  
    248  
    249 /********************************************************************
    250 * 名称 : flash()
    251 * 功能 : 延时,时间为2个NOP,大概为2US
    252 * 输入 : 无
    253 * 输出 : 无
    254 ***********************************************************************/
    255 void flash(void) 
    256 {
    257 _nop_();
    258 _nop_();
    259 }
    260  
    261 /********************************************************************
    262 * 名称 : x24c02_init()
    263 * 功能 : 24c02初始化子程序
    264 * 输入 : 无
    265 * 输出 : 无
    266 ***********************************************************************/
    267 void x24c02_init(void) 
    268 {
    269 scl = 1;
    270 flash();
    271 sda = 1;
    272 flash();
    273 }
    274  
    275 /********************************************************************
    276 * 名称 : start(void)
    277 * 功能 : 启动I2C总线
    278 * 输入 : 无
    279 * 输出 : 无
    280 ***********************************************************************/
    281 void start(void)
    282 {
    283 scl = 1; 
    284 flash();
    285 sda = 1;
    286 flash(); 
    287 sda = 0; 
    288 flash(); 
    289 scl = 0; 
    290 flash();
    291 }
    292  
    293 /********************************************************************
    294 * 名称 : stop()
    295 * 功能 : 停止I2C总线
    296 * 输入 : 无
    297 * 输出 : 无
    298 ***********************************************************************/
    299 void stop() 
    300 {
    301 scl = 0;
    302 flash();
    303 sda = 0; 
    304 flash();
    305 scl = 1;
    306 flash();
    307 sda = 1;
    308 flash();
    309 }
    310  
    311 /********************************************************************
    312 * 名称 : writex()
    313 * 功能 : 写一个字节
    314 * 输入 : j(需要写入的值)
    315 * 输出 : 无
    316 ***********************************************************************/
    317 void writex(uchar j)
    318 {  
    319 uchar i,temp;
    320 temp = j;
    321 for(i=0; i<8; i++)
    322 {
    323 scl = 0; 
    324 flash(); 
    325 sda = (bit)(temp & 0x80); 
    326 flash();
    327 scl = 1; 
    328 flash();
    329 temp = temp << 1; 
    330 }
    331 scl = 0;
    332 flash(); 
    333 }
    334  
    335 /********************************************************************
    336 * 名称 : readx()
    337 * 功能 : 读一个字节
    338 * 输入 : 无
    339 * 输出 : 读出的值
    340 ***********************************************************************/
    341 uchar readx(void)
    342 {
    343 uchar i, j, k = 0;
    344 for(i=0; i<8; i++)
    345 {
    346 scl = 0;
    347 flash();
    348 if(sda == 1)
    349 {
    350 j = 1;
    351 }
    352 else j = 0;
    353 k = (k << 1) | j; 
    354 scl = 1;
    355 flash();
    356 } 
    357 return(k);
    358 }
    359  
    360 /********************************************************************
    361 * 名称 : ack()
    362 * 功能 : I2C总线时钟
    363 * 输入 : 无
    364 * 输出 : 无
    365 ***********************************************************************/
    366 void ack(void)
    367 {
    368 uchar i = 0;
    369 scl = 1;
    370 flash();
    371 while((sda == 1) && (i < 255)) 
    372 {
    373 i++;
    374 }
    375 scl = 0;
    376 flash();
    377 }
    378  
    379 /********************************************************************
    380 * 名称 : x24c02_read()
    381 * 功能 : 从24c02中读出值
    382 * 输入 : address(要在这个地址读取值)
    383 * 输出 : 从24c02中读出的值
    384 ***********************************************************************/
    385 uchar x24c02_read(uchar address)
    386 {
    387 uchar i;
    388 start();
    389 writex(0xa0);
    390 ack();
    391 writex(address);
    392 ack();
    393 start();
    394 writex(0xa1);
    395 ack();
    396 i = readx();
    397 stop();
    398 return(i);
    399 }
    400  
    401 /********************************************************************
    402 * 名称 : x24c02_write()
    403 * 功能 : 想24c02中写入数据
    404 * 输入 : address(地址) , info(值)
    405 * 输出 : 无
    406 ***********************************************************************/
    407 void x24c02_write(uchar address, uchar info)
    408 {
    409 start();
    410 writex(0xa0);
    411 ack();
    412 writex(address);
    413 ack();
    414 writex(info);
    415 ack();
    416 stop();
    417 }
    418  
    419  
    420 /********************************************************************
    421 * 名称 : main()
    422 * 功能 : 
    423 * 输入 : 无
    424 * 输出 : 无
    425 ***********************************************************************/
    426 main()
    427 {
    428 //=========初始化红外线控制 Begin=======//
    429 IE = 0x84;                 //允许总中断中断,使能 INT1 外部中断
    430 TCON = 0x10;               //触发方式为脉冲负边沿触发
    431  
    432 IRIN=1;                    //I/O口初始化
    433 BEEP=1;
    434 RELAY=1; 
    435 //=========初始化红外线控制 End=======//
    436  
    437 delay1(10);                 //延时
    438 L1602_init();               //初始化LCD
    439  
    440  
    441 L1602_string(1, 1, LCD_ID_1);  //设置 液晶显示屏  显示LCD_ID_1的内容
    442 L1602_string(2, 1, LCD_ID_2);  //设置 液晶显示屏  显示LCD_ID_2的内容
    443  
    444  
    445 //=======初始化串口 Begin=======//
    446 Com_Init();
    447 //=======初始化串口 Begin=======//
    448  
    449 //=======初始化FLASH Begin=======//
    450 x24c02_init();            //初始化24C02
    451 PWM_ON = x24c02_read(2);    //读出保存的数据赋于sec
    452  
    453 L1602_char(2,8,PWM_ON+'0');
    454 //=======初始化FALSH End=======//
    455  
    456 while(1)
    457 {
    458 PWM_Contrl();
    459 }
    460  
    461 } //end main
    462  
    463  
    464 /********************************************************************
    465 * 名称 : IR_IN interrupt 2 using 0
    466 * 功能 : 接收红外线数据,并中断处理液晶屏显示
    467 * 输入 : 无
    468 * 输出 : 无
    469 ***********************************************************************/
    470 void IR_IN() interrupt 2 using 0
    471 {
    472 //======初始化串口发送数据 变量  Begin=======//
    473 uchar code strSpeed[][4] = {"0", "1", "2", "3" };     
    474 uchar *p = strSpeed[0];  //初始化为 0 档
    475 //======初始化串口发送数据 变量  End=======//
    476  
    477 unsigned char j,k,N=0;
    478 EX1 = 0;   
    479 delay(15);
    480 if (IRIN==1) 
    481 { 
    482 EX1 =1;
    483 return;
    484 } 
    485 //确认IR信号出现
    486 while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
    487 {
    488 delay(1);
    489 }
    490  
    491 for (j=0;j<4;j++)         //收集四组数据
    492 { 
    493 for (k=0;k<8;k++)        //每组数据有8位
    494 {
    495 while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
    496 {
    497 delay(1);
    498 }
    499 while (!IRIN)          //等 IR 变为高电平
    500 {
    501 delay(1);
    502 }
    503 while (IRIN)           //计算IR高电平时长
    504 {
    505 delay(1);
    506 N++;           
    507 if (N>=30)
    508 { 
    509 EX1=1;
    510 return;
    511 } //if (N>=30)    //0.14ms计数过长自动离开。
    512 } //while (IRIN)      //高电平计数完毕                
    513 IRCOM[j]=IRCOM[j] >> 1;            //数据最高位补“0”
    514 if (N>=8) 
    515 {
    516 IRCOM[j] = IRCOM[j] | 0x80;    //数据最高位补“1”
    517 }  //if (N>=8)
    518 N=0;
    519 }//for (k=0;k<8;k++)
    520 }//for (j=0;j<4;j++) 
    521  
    522 if (IRCOM[2]!=~IRCOM[3])
    523 { 
    524 EX1=1;
    525 return; 
    526 }
    527  
    528 IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
    529 IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
    530  
    531 if(IRCOM[5]>9)
    532 { 
    533 IRCOM[5]=IRCOM[5]+0x37;
    534 }
    535 else
    536 IRCOM[5]=IRCOM[5]+0x30;
    537  
    538 if(IRCOM[6]>9)
    539 { 
    540 IRCOM[6]=IRCOM[6]+0x37;
    541 }
    542 else
    543 IRCOM[6]=IRCOM[6]+0x30;
    544  
    545 //=======控制 液晶显示屏显示数据 Begin=========//
    546  
    547 if( ('4' == IRCOM[6]) && ('5' == IRCOM[5]))  //触发开关键
    548 { 
    549 PWM_ON=0;//风扇关闭
    550 //PWM_SLEEP = 0;
    551  
    552 p = strSpeed[0];   //档速0
    553 L1602_char(2,8,'0');
    554 }
    555 else if( ('0' == IRCOM[6]) && ('C' == IRCOM[5]))  //触发1号键
    556 {
    557 PWM_ON=1;//风扇开启
    558 //PWM_SLEEP=10;//风扇休眠时间
    559  
    560 p = strSpeed[1];   //档速1
    561 L1602_char(2,8,'1');
    562 }
    563 else if( ('1' == IRCOM[6]) && ('8' == IRCOM[5]))  //触发2号键
    564 {
    565 PWM_ON=2;//风扇开启
    566 //PWM_SLEEP=100;//风扇休眠时间
    567  
    568 p = strSpeed[2];   //档速2
    569 L1602_char(2,8,'2');
    570 }
    571 else if( ('5' == IRCOM[6]) && ('E' == IRCOM[5]))  //触发3号键
    572 {
    573 PWM_ON=3;//风扇开启
    574 //PWM_SLEEP=1000;//风扇休眠时间
    575 p = strSpeed[3];   //档速3
    576 L1602_char(2,8,'3');
    577 }
    578 //=======控制 液晶显示屏显示数据 End=========//
    579  
    580  
    581 //=======发送串口数据 Begin=========//
    582 while(1)
    583 {
    584 SBUF = *p;
    585 while(!TI)                   //如果发送完毕,硬件会置位TI
    586 {
    587 _nop_();
    588 }
    589 p++;
    590 if(*p == '') break;     //在每个字符串的最后,会有一个''
    591 TI = 0;                     //TI清零
    592 }
    593 //=======发送串口数据 End=========//
    594  
    595 //beep();
    596 EX1 = 1; 
    597  
    598 //将风扇的档数记录
    599 x24c02_write(2,PWM_ON);   //在24c08的地址2中写入数据sec
    600 } 
    601  
    602 /**********************************************************/
    603 void beep()
    604 {
    605 unsigned char i;
    606 for (i=0;i<100;i++)
    607 {
    608 delay(4);
    609 BEEP=!BEEP;                 //BEEP取反
    610 } 
    611 BEEP=1;                      //关闭蜂鸣器
    612 }  
    613 /**********************************************************/
    614 void delay(unsigned char x)    //x*0.14MS
    615 {
    616 unsigned char i;
    617 while(x--)
    618 {
    619 for (i = 0; i<13; i++) {}
    620 }
    621 }
    622  
    623 /**********************************************************/
    624 void delay1(int ms)
    625 {
    626 unsigned char y;
    627 while(ms--)
    628 {
    629 for(y = 0; y<250; y++)
    630 {
    631 _nop_();
    632 _nop_();
    633 _nop_();
    634 _nop_();
    635 }
    636 }
    637 }
    View Code

    软件编程部分源码:

      1 ===================================================================================================
      2 // FanDlg.h : 头文件
      3 //
      4  
      5 #pragma once
      6  
      7 #define COM_RECVDATA WM_USER+1000//自定义消息
      8  
      9 // CFanDlg 对话框
     10 class CFanDlg : public CDialogEx
     11 {
     12 // 构造
     13 public:
     14 CFanDlg(CWnd* pParent = NULL);    // 标准构造函数
     15  
     16 // 对话框数据
     17 enum { IDD = IDD_FAN_DIALOG };
     18  
     19 protected:
     20 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
     21  
     22 private:
     23 HANDLE hCom; //串口句柄
     24 HANDLE hCommThread; //串口线程
     25  
     26 public:
     27 //获取串口句柄
     28 HANDLE GetComHandle();
     29  
     30 // 实现
     31 protected:
     32 HICON m_hIcon;
     33  
     34 // 生成的消息映射函数
     35 virtual BOOL OnInitDialog();
     36 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
     37 afx_msg void OnPaint();
     38 afx_msg HCURSOR OnQueryDragIcon();
     39 DECLARE_MESSAGE_MAP()
     40  
     41 //打开串口
     42 //返回值:TRUE 开启成功  FLASE 开启失败
     43 BOOL OpenCom(CString strPort);
     44  
     45 //接收到数据响应消息
     46 afx_msg LRESULT OnRecvData(WPARAM wParam, LPARAM lParam);
     47  
     48 public:
     49 afx_msg void OnClose();
     50 };
     51  
     52 //声明 串口接收线程
     53 extern DWORD WINAPI SerialPort1ThreadProcess(CFanDlg *pFan); ===================================================================================================  
     54  
     55 // FanDlg.cpp : 实现文件
     56 //
     57  
     58 #include "stdafx.h"
     59 #include "Fan.h"
     60 #include "FanDlg.h"
     61 #include "afxdialogex.h"
     62  
     63 #ifdef _DEBUG
     64 #define new DEBUG_NEW
     65 #endif
     66  
     67 // CFanDlg 对话框
     68  
     69 CFanDlg::CFanDlg(CWnd* pParent /*=NULL*/)
     70 : CDialogEx(CFanDlg::IDD, pParent)
     71 {
     72 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
     73 }
     74  
     75 void CFanDlg::DoDataExchange(CDataExchange* pDX)
     76 {
     77 CDialogEx::DoDataExchange(pDX);
     78 }
     79  
     80 BEGIN_MESSAGE_MAP(CFanDlg, CDialogEx)
     81 ON_WM_SYSCOMMAND()
     82 ON_WM_PAINT()
     83 ON_WM_QUERYDRAGICON()
     84 ON_MESSAGE(COM_RECVDATA, &CFanDlg::OnRecvData)
     85 ON_WM_CLOSE()
     86 END_MESSAGE_MAP()
     87  
     88  
     89 // CFanDlg 消息处理程序
     90  
     91 BOOL CFanDlg::OnInitDialog()
     92 {
     93 CDialogEx::OnInitDialog();
     94  
     95 this->SetWindowTextW(_T("风扇控制系统--客户端"));
     96  
     97 // 将“关于...”菜单项添加到系统菜单中。
     98  
     99 // IDM_ABOUTBOX 必须在系统命令范围内。
    100 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    101 ASSERT(IDM_ABOUTBOX < 0xF000);
    102  
    103 CMenu* pSysMenu = GetSystemMenu(FALSE);
    104 if (pSysMenu != NULL)
    105 {
    106 BOOL bNameValid;
    107 CString strAboutMenu;
    108 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    109 ASSERT(bNameValid);
    110 if (!strAboutMenu.IsEmpty())
    111 {
    112 pSysMenu->AppendMenu(MF_SEPARATOR);
    113 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    114 }
    115 }
    116  
    117 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    118 //  执行此操作
    119 SetIcon(m_hIcon, TRUE);     // 设置大图标
    120 SetIcon(m_hIcon, FALSE);     // 设置小图标
    121  
    122 // TODO: 在此添加额外的初始化代码
    123 BOOL bStatu = OpenCom(_T("COM4"));
    124  
    125 //启动串口监视线程
    126 DWORD threadID;
    127 hCommThread = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
    128   (LPTHREAD_START_ROUTINE)SerialPort1ThreadProcess, 
    129   this, 0, &threadID);
    130 if (hCommThread == NULL)
    131 {
    132 ::AfxMessageBox(_T("创建串口1处理线程失败"));
    133 ::PostQuitMessage(0);
    134 }
    135  
    136  
    137 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    138 }
    139  
    140 BOOL CFanDlg::OpenCom(CString strPort)
    141 {
    142        hCom=CreateFile(strPort,
    143               GENERIC_READ|GENERIC_WRITE, //允许读和写
    144               0, //独占方式
    145               NULL,
    146               OPEN_EXISTING, //打开而不是创建
    147               0, //同步方式
    148               NULL);
    149  
    150        if(hCom==(HANDLE)-1)
    151        {
    152             AfxMessageBox(_T("打开COM失败!"));
    153             return FALSE;
    154        }
    155  
    156    DCB wdcb;
    157    GetCommState (hCom, &wdcb);
    158    wdcb.BaudRate=9600;//波特率:9600,其他:不变
    159    if(!SetCommState (hCom, &wdcb))
    160    {
    161 MessageBox(_T("串口设置出错!"));
    162 return FALSE;
    163 }
    164 PurgeComm(hCom, PURGE_TXCLEAR);
    165  
    166        return TRUE;
    167 }
    168  
    169  
    170  
    171 void CFanDlg::OnSysCommand(UINT nID, LPARAM lParam)
    172 {
    173 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    174 {
    175 CAboutDlg dlgAbout;
    176 dlgAbout.DoModal();
    177 }
    178 else
    179 {
    180 CDialogEx::OnSysCommand(nID, lParam);
    181 }
    182 }
    183  
    184 // 如果向对话框添加最小化按钮,则需要下面的代码
    185 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    186 //  这将由框架自动完成。
    187  
    188 void CFanDlg::OnPaint()
    189 {
    190 if (IsIconic())
    191 {
    192 CPaintDC dc(this); // 用于绘制的设备上下文
    193  
    194 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    195  
    196 // 使图标在工作区矩形中居中
    197 int cxIcon = GetSystemMetrics(SM_CXICON);
    198 int cyIcon = GetSystemMetrics(SM_CYICON);
    199 CRect rect;
    200 GetClientRect(&rect);
    201 int x = (rect.Width() - cxIcon + 1) / 2;
    202 int y = (rect.Height() - cyIcon + 1) / 2;
    203  
    204 // 绘制图标
    205 dc.DrawIcon(x, y, m_hIcon);
    206 }
    207 else
    208 {
    209 CDialogEx::OnPaint();
    210 }
    211 }
    212  
    213 //当用户拖动最小化窗口时系统调用此函数取得光标
    214 //显示。
    215 HCURSOR CFanDlg::OnQueryDragIcon()
    216 {
    217 return static_cast<HCURSOR>(m_hIcon);
    218 }
    219  
    220 //接收数据后(通过监听线程发来的用户自定义消息)显示
    221 LRESULT CFanDlg::OnRecvData(WPARAM wParam, LPARAM lParam)
    222 {
    223 CString recvStr((char *)wParam);
    224 this->GetDlgItem(IDC_EDT_FAN_SPEED)->SetWindowTextW(recvStr + _T("级风速"));
    225 UpdateData(false);
    226 return TRUE;
    227 }
    228  
    229 HANDLE CFanDlg::GetComHandle()
    230 {
    231 return hCom; //串口句柄
    232 }
    233  
    234 //以一个线程不同监控串口行接收的数据
    235 DWORD WINAPI SerialPort1ThreadProcess(CFanDlg *pFan)
    236 {
    237 char str[101];
    238 DWORD wCount; //读取的字节数
    239 while(TRUE)
    240 {
    241 ReadFile(pFan->GetComHandle(),str, 100, &wCount, NULL);
    242         if(wCount > 0) //收到数据
    243 {
    244 //发送消息给对话框主窗口,以进行接收内容的显示
    245 str[wCount] = '';
    246 ::PostMessage(pFan->m_hWnd, COM_RECVDATA, (unsigned int) str, wCount); 
    247 }
    248 Sleep((DWORD)0.1);
    249 }
    250 return TRUE;
    251 }
    252  
    253 void CFanDlg::OnClose()
    254 {
    255 // TODO: 在此添加消息处理程序代码和/或调用默认值
    256 //CloseHandle(hCom);      //程序退出时关闭串口
    257  
    258 CDialogEx::OnClose();
    259 }
    View Code

    结束语: 快乐分享技术,每天进步一点。                                                                      2014.2.23  北京 

    不服?有本事你扫我啊!!!

     

    原文出处:http://www.cnblogs.com/zhuojun/ 

  • 相关阅读:
    Cgroup学习笔记
    基于dubbo框架下的RPC通讯协议性能测试
    More about dubbo
    基于nginx tomcat redis分布式web应用的session共享配置
    基于开源Dubbo分布式RPC服务框架的部署整合
    More about Tair (NoSql)
    MySql Replication配置
    Memcached、Redis OR Tair
    基于淘宝开源Tair分布式KV存储引擎的整合部署
    关于TbSchedule任务调度管理框架的整合部署
  • 原文地址:https://www.cnblogs.com/zhuojun/p/4067061.html
Copyright © 2020-2023  润新知