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

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

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

实现功能 :  
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/ 

原文地址:https://www.cnblogs.com/zhuojun/p/4067061.html