320 likes | 593 Views
Windows Mobile 串口编程. 南京大学软件学院 2005 年 6 月. 概要. 一、背景知识 二、源码介绍 三、具体应用 四、参考资料. 概要. 一、 背景知识 二、源码介绍 三、具体应用 四、参考资料. 为什么要用串口. 串口正在被更稳定的接口所代替 大多数的笔记本电脑都没有外置串口 但基于 Windows Mobile 的设备仍然保留着串口 Windows Mobile 常用的外设也都是外置串口的终端设备 GPS 、 GSM/GPRS 模块 所以,目前看来串口在 Windows Mobile 中的地位暂时是不会动摇. 需要封装成类吗.
E N D
Windows Mobile串口编程 南京大学软件学院 2005年6月
概要 一、背景知识二、源码介绍三、具体应用四、参考资料
概要 一、背景知识二、源码介绍三、具体应用四、参考资料
为什么要用串口 • 串口正在被更稳定的接口所代替 • 大多数的笔记本电脑都没有外置串口 • 但基于 Windows Mobile 的设备仍然保留着串口 • Windows Mobile 常用的外设也都是外置串口的终端设备 • GPS、GSM/GPRS模块 • 所以,目前看来串口在Windows Mobile中的地位暂时是不会动摇
需要封装成类吗 • 不要把串口通信封装成类 • 把一个事物封装成类,那这个事物就一定是不易改变的 • 如果每次编写都要修改,那封装成类就一点意义都没有了 • 串口通信大多数用来与终端设备进行通信,需要对终端设备返回的数据进行处理 • 而返回的数据在什么时间返回、数据量的大小不是确定的,非要封装成类难度很大
概要 一、背景知识二、源码介绍三、具体应用四、参考资料
打开串口 hSerial = CreateFile( _T(“COM1:”), GENERIC_READ | ENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if (hSerial == NULL ) //串口打开失败{ return; }
配置串口 DCB PortDCB;PortDCB.DCBlength = sizeof(DCB);
默认串口参数 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; }
配置超时值 COMMTIMEOUTS CommTimeouts;GetCommTimeouts(m_hSerial, &CommTimeouts);CommTimeouts.ReadIntervalTimeout = MAXDWORD;CommTimeouts.ReadTotalTimeoutMultiplier = 10;CommTimeouts.ReadTotalTimeoutConstant = 10;CommTimeouts.WriteTotalTimeoutMultiplier = 50;
配置超时值 CommTimeouts.WriteTotalTimeoutConstant = 100; if (!SetCommTimeouts(hSerial, &CommTimeouts)) // "不能设置超时参数" { return; }
注意事项 • Windows Mobile的串口驱动不支持重叠 • 收和发分开,接收串口数据时必须创建一个线程专门用于接收数据 • 串口的默认的配置大部分是不需要修改的,一般改动就是波特率、位数、奇偶校检等几项
注意事项 • 超时值是需要改动的。ReadIntervalTimeout是指两个字符传送之间的超时时间 • 一次写操作的超时时间等于WriteTotalTimeoutMultiplier 乘以 要发送的字符数 加上WriteTotalTimeoutConstant,单位是毫秒 • 读操作的超时和写类似 • 设置太小可能丢失数据
关闭串口 if ( hSerial != NULL ) { CloseHandle ( hSerial ); hSerial = NULL; }
向串口发送数据 WriteFile ( hSerial, // 句柄 &Byte, // 数据缓冲区地址 nByte, // 数据大小 &dwNumBytes, // 返回发送出去的字节数 NULL // 不支持重叠);
注意事项 • 向串口发送数据一般都会成功 • 但如果终端设备需要一定处理时间或者称反应时间的话,那么两个写操作之间一定要注意时间间隔不能太小 • 具体的时间由终端设备的反应时间和缓冲区大小有关
读取串口数据 • 正如Windows Mobile的帮助文档所说,串口通信是最简单的通信之一,麻烦的是在读数据方面 • 除了考虑及时的读取数据外,还要解决接收到的数据的处理工作 • 如果在读取串口数据的线程中安置数据处理工作,那么 • 可能会丢失数据(终端设备发送数据但是没收到) • 也有可能不会丢失(终端设备发送的数据的时间、大小都是确定的) • 如果肯定接收的数据在处理工作结束后终端设备才发送数据,那么完全可以将数据处理工作放在读取串口的线程中
及时的读取数据 // 假设接收的都是字符 UINT ReadThread ( LPVOID pParam ) // 接收串口数据线程{ HANDLE hPort = *(HANDLE*)pParam; BYTE Byte; int iCounter = 0; DWORD dwBytes; char ReceiveBuf[1000]; // 缓冲区的大小
SetCommMask ( hPort, EV_RXCHAR ); //只接收字符 while ( hPort != INVALID_HANDLE_VALUE ) { DWORD dwCommStatus; WaitCommEvent(hPort, &dwCommStatus, 0); SetCommMask (hPort, EV_RXCHAR); //重新设置要等待的信号
接收数据 // 接收数据 do { ReadFile(hPort, &Byte, 1, &dwBytes, 0); if(dwBytes == 1) { ReceiveBuf[iCounter++] = Byte; if ( iCounter == 1000) // 接收缓冲区已满 { return -1; } } } while (dwBytes == 1);
没接到数据 if ( iCounter == 0) //没接到数据 { continue; }
保存数据 //保存数据 char* pTmp = new char[iCounter + 1]; if(pTmp == NULL) //内存不足,接收串口数据线程关闭 { return -1; } memcpy(pTmp, ReceiveBuf, iCounter); pTmp[iCounter] = NULL; //字符串结尾 /****** 在这里创建新线程处理数据 *****/
析构 //处理完数据后,别忘了delete[] pTmp; AfxBeginThread ( ProcessData, pTmp ); iCounter = 0; ////清空计数器} ///end while return 0; }
概要 一、背景知识二、源码介绍三、具体应用四、参考资料
具体应用 • 在基于Windows CE的产品上具备无线通讯功能 • 拨号上网、拨打电话、收发短信 • 外接手机 • 手机只是起到在上网浏览期间接收和发送数据的作用 • 集成手机模块 • 手机模块要完成无线通讯的全部功能
收发短信 • 利用的是AT命令集和串口通讯 • 不过刚才介绍的线程是不适合接收手机模块返回的数据的
为什么呢 • 并不是所有的手机模块都具备存储功能,所以每次在启动的时候都要初始化一些必要的设置 • 短信文本模式、字符格式、麦克和听筒的音量 • 如果发送一个命令后紧接着发送另一个命令,那么手机模块是吃不消的 • 必须先发送一个命令,然后等待手机模块对这个命令的返回结果,如果成功了再发送下一个命令,这才能够保证初始化都能成功完成,而且可以实时显示当前工作状态
为什么呢 • 手机模块返回的信息不确定 • 任何发送到手机模块的命令都会被返回,返回的字符串中可能包含对命令的响应,也可能不包含 • 必须对整个返回信息做检索工作,而且还要区分返回的信息是否是对命令的响应 • "\r\nRING\r\n"
概要 一、背景知识二、源码介绍三、具体应用四、参考资料
相关站点 • 微软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
几本书籍 • 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的一套书籍
结束语 谢谢