1 / 32

Windows Mobile 串口编程

Windows Mobile 串口编程. 南京大学软件学院 2005 年 6 月. 概要. 一、背景知识 二、源码介绍 三、具体应用 四、参考资料. 概要. 一、 背景知识 二、源码介绍 三、具体应用 四、参考资料. 为什么要用串口. 串口正在被更稳定的接口所代替 大多数的笔记本电脑都没有外置串口 但基于 Windows Mobile 的设备仍然保留着串口 Windows Mobile 常用的外设也都是外置串口的终端设备 GPS 、 GSM/GPRS 模块 所以,目前看来串口在 Windows Mobile 中的地位暂时是不会动摇. 需要封装成类吗.

manjit
Download Presentation

Windows Mobile 串口编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Windows Mobile串口编程 南京大学软件学院 2005年6月

  2. 概要 一、背景知识二、源码介绍三、具体应用四、参考资料

  3. 概要 一、背景知识二、源码介绍三、具体应用四、参考资料

  4. 为什么要用串口 • 串口正在被更稳定的接口所代替 • 大多数的笔记本电脑都没有外置串口 • 但基于 Windows Mobile 的设备仍然保留着串口 • Windows Mobile 常用的外设也都是外置串口的终端设备 • GPS、GSM/GPRS模块 • 所以,目前看来串口在Windows Mobile中的地位暂时是不会动摇

  5. 需要封装成类吗 • 不要把串口通信封装成类 • 把一个事物封装成类,那这个事物就一定是不易改变的 • 如果每次编写都要修改,那封装成类就一点意义都没有了 • 串口通信大多数用来与终端设备进行通信,需要对终端设备返回的数据进行处理 • 而返回的数据在什么时间返回、数据量的大小不是确定的,非要封装成类难度很大

  6. 概要 一、背景知识二、源码介绍三、具体应用四、参考资料

  7. 打开串口 hSerial = CreateFile( _T(“COM1:”), GENERIC_READ | ENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if (hSerial == NULL ) //串口打开失败{ return; }

  8. 配置串口 DCB PortDCB;PortDCB.DCBlength = sizeof(DCB);

  9. 默认串口参数 GetCommState ( hSerial, &PortDCB);PortDCB.BaudRate = 115200; // baud PortDCB.ByteSize = 8; // Number of bits/byte, 4-8 PortDCB.Parity = NOPARITY; // 奇偶位PortDCB.StopBits = ONESTOPBIT; if ( ! SetCommState ( hSerial, &PortDCB ) ) // 配置串口失败{ return; }

  10. 配置超时值 COMMTIMEOUTS CommTimeouts;GetCommTimeouts(m_hSerial, &CommTimeouts);CommTimeouts.ReadIntervalTimeout = MAXDWORD;CommTimeouts.ReadTotalTimeoutMultiplier = 10;CommTimeouts.ReadTotalTimeoutConstant = 10;CommTimeouts.WriteTotalTimeoutMultiplier = 50;

  11. 配置超时值 CommTimeouts.WriteTotalTimeoutConstant = 100; if (!SetCommTimeouts(hSerial, &CommTimeouts)) // "不能设置超时参数" { return; }

  12. 注意事项 • Windows Mobile的串口驱动不支持重叠 • 收和发分开,接收串口数据时必须创建一个线程专门用于接收数据 • 串口的默认的配置大部分是不需要修改的,一般改动就是波特率、位数、奇偶校检等几项

  13. 注意事项 • 超时值是需要改动的。ReadIntervalTimeout是指两个字符传送之间的超时时间 • 一次写操作的超时时间等于WriteTotalTimeoutMultiplier 乘以 要发送的字符数 加上WriteTotalTimeoutConstant,单位是毫秒 • 读操作的超时和写类似 • 设置太小可能丢失数据

  14. 关闭串口 if ( hSerial != NULL ) { CloseHandle ( hSerial ); hSerial = NULL; }

  15. 向串口发送数据 WriteFile ( hSerial, // 句柄 &Byte, // 数据缓冲区地址 nByte, // 数据大小 &dwNumBytes, // 返回发送出去的字节数 NULL // 不支持重叠);

  16. 注意事项 • 向串口发送数据一般都会成功 • 但如果终端设备需要一定处理时间或者称反应时间的话,那么两个写操作之间一定要注意时间间隔不能太小 • 具体的时间由终端设备的反应时间和缓冲区大小有关

  17. 读取串口数据 • 正如Windows Mobile的帮助文档所说,串口通信是最简单的通信之一,麻烦的是在读数据方面 • 除了考虑及时的读取数据外,还要解决接收到的数据的处理工作 • 如果在读取串口数据的线程中安置数据处理工作,那么 • 可能会丢失数据(终端设备发送数据但是没收到) • 也有可能不会丢失(终端设备发送的数据的时间、大小都是确定的) • 如果肯定接收的数据在处理工作结束后终端设备才发送数据,那么完全可以将数据处理工作放在读取串口的线程中

  18. 及时的读取数据 // 假设接收的都是字符 UINT ReadThread ( LPVOID pParam ) // 接收串口数据线程{ HANDLE hPort = *(HANDLE*)pParam; BYTE Byte; int iCounter = 0; DWORD dwBytes; char ReceiveBuf[1000]; // 缓冲区的大小

  19. SetCommMask ( hPort, EV_RXCHAR ); //只接收字符 while ( hPort != INVALID_HANDLE_VALUE ) { DWORD dwCommStatus; WaitCommEvent(hPort, &dwCommStatus, 0); SetCommMask (hPort, EV_RXCHAR); //重新设置要等待的信号

  20. 接收数据 // 接收数据 do { ReadFile(hPort, &Byte, 1, &dwBytes, 0); if(dwBytes == 1) { ReceiveBuf[iCounter++] = Byte; if ( iCounter == 1000) // 接收缓冲区已满 { return -1; } } } while (dwBytes == 1);

  21. 没接到数据 if ( iCounter == 0) //没接到数据 { continue; }

  22. 保存数据 //保存数据 char* pTmp = new char[iCounter + 1]; if(pTmp == NULL) //内存不足,接收串口数据线程关闭 { return -1; } memcpy(pTmp, ReceiveBuf, iCounter); pTmp[iCounter] = NULL; //字符串结尾 /****** 在这里创建新线程处理数据 *****/

  23. 析构 //处理完数据后,别忘了delete[] pTmp; AfxBeginThread ( ProcessData, pTmp ); iCounter = 0; ////清空计数器} ///end while return 0; }

  24. 概要 一、背景知识二、源码介绍三、具体应用四、参考资料

  25. 具体应用 • 在基于Windows CE的产品上具备无线通讯功能 • 拨号上网、拨打电话、收发短信 • 外接手机 • 手机只是起到在上网浏览期间接收和发送数据的作用 • 集成手机模块 • 手机模块要完成无线通讯的全部功能

  26. 收发短信 • 利用的是AT命令集和串口通讯 • 不过刚才介绍的线程是不适合接收手机模块返回的数据的

  27. 为什么呢 • 并不是所有的手机模块都具备存储功能,所以每次在启动的时候都要初始化一些必要的设置 • 短信文本模式、字符格式、麦克和听筒的音量 • 如果发送一个命令后紧接着发送另一个命令,那么手机模块是吃不消的 • 必须先发送一个命令,然后等待手机模块对这个命令的返回结果,如果成功了再发送下一个命令,这才能够保证初始化都能成功完成,而且可以实时显示当前工作状态

  28. 为什么呢 • 手机模块返回的信息不确定 • 任何发送到手机模块的命令都会被返回,返回的字符串中可能包含对命令的响应,也可能不包含 • 必须对整个返回信息做检索工作,而且还要区分返回的信息是否是对命令的响应 • "\r\nRING\r\n"

  29. 概要 一、背景知识二、源码介绍三、具体应用四、参考资料

  30. 相关站点 • 微软Windows Mobile官方网站 http://www.microsoft.com/china/windowsmobile/default.mspx • http://www.csdn.net/ • Windows Mobile专题http://www.csdn.net/subject/WM/ • http://www.todopocketpc.com/ • http://www.handit.de/index.php?fuseaction=detail&katid=115&produktid=440 • http://www.resco-net.com/homepage.asp

  31. 几本书籍 • Pocket PC 开发指南http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS0013406 • How to do everything系列的Smartphone版本http://www.amazon.com/exec/obidos/tg/detail/-/0072256745/qid=1105684631/sr=1-3/ref=sr_1_3/103-9570213-4555817?v=glance&s=books • 微软从系统上介绍Windows CE的一套书籍

  32. 结束语 谢谢

More Related