【头条】造风扇技术那家强,码农为自己的翔代言
码农自己制作小风扇,妈妈再也用不担心我们夏天晚上被热醒了。
简要描述:
硬件线路连接=>硬件编程=>软件编程
实现功能 :
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 == '\0') 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 == '\0') break; //在每个字符串的最后,会有一个'\0' 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 }
软件编程部分源码:
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] = '\0'; 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 }
结束语: 快乐分享技术,每天进步一点。 2014.2.23 北京
不服?有本事你扫我啊!!!
原文出处:http://www.cnblogs.com/zhuojun/