250 likes | 438 Views
项目 10 :串行口通信- PDA 中的串口( 2 ). 本节课程主要知识点 串口的编程 串口通信的扩展使用. 重点和难点. 重点 串口的编程 难点 串口通信的扩展使用. 串口的编程. 串口通信基本过程( 1/2 ). 按协议的设置初始化并打开串行口,如果串口没有被其他应用程序占用,则该应用程序占用该串口。 通知 Windows CE ,本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。 配置该串行口。. 串口通信基本过程( 2/2 ). 在串口上传输数据,根据约定,在传输过程中进行校验。
E N D
项目10:串行口通信-PDA中的串口(2) 本节课程主要知识点 • 串口的编程 • 串口通信的扩展使用
重点和难点 重点 • 串口的编程 难点 • 串口通信的扩展使用
串口通信基本过程(1/2) • 按协议的设置初始化并打开串行口,如果串口没有被其他应用程序占用,则该应用程序占用该串口。 • 通知Windows CE,本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。 • 配置该串行口。
串口通信基本过程(2/2) • 在串口上传输数据,根据约定,在传输过程中进行校验。 • 不需要此串口时,关闭串口,即释放串口以供其它应用程序使用。
串口通信编程(1/3) • 用于串行通信的函数和结构在winbase.h头文件中定义。在基于Windows CE的设备上通过串行通信端口读写的任务由调用文件读写函数完成。 • CreateFile 打开串行口。 • GetCommState 获取串口的当前控制设置数据。
串口通信编程(2/3) • SetCommState 按照DCB结构的数据配置串行口。 • GetCommTimeouts 获得指定通信设备上所有读/写操作的超时参数。 • SetCommTimeouts 设置指定通信设备上所有读/写操作的超时参数。 • WriteFile 向串行口写数据,这样将把数据传送给串行口连接的另一端设备。
串口通信编程(3/3) • ReadFile 从串行口读数据,这样将接收串行口连接另一端的设备传过来的数据。 • SetCommMask 指定为通信设备监视的一组事件。 • GetComMask 获得指定通信设备的事件掩码值。
初始化串行口 • 首先用CreateFile 函数打开指定串口,设置其中的参数 • 访问类型为GENERIC_READ |GENERIC_WRITE • 共享模式为0 • 创建标志为OPEN_EXISTING • 模板句柄为NULL • 如果端口不存在,则返回 • ERROR_FILE_NOT_FOUND
初始化串行口典型代码 • hSerial = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); • 如果能够正常打开串口,hSerial应该返回的是串口的句柄。
配置串口 • 设置波特率、数据位、奇偶校验位、停止位和流控制方式,并且可以恢复缺省值。 • 使用GetCommState(hComm,&dcb)读取当前串口设备控制块DCB(Device Control Block)设置。 • 修改后通过SetCommState(hComm,&dcb)将其写入。
配置串口的代码 • DCB PortDCB; • PortDCB.DCBlength = sizeof(DCB); • GetCommState(hSerial, &PortDCB);//读DCB • PortDCB.BaudRate = 115200; // 波特率 • PortDCB.ByteSize = 8; //数据位 • PortDCB.Parity = NOPARITY; //校验位 • PortDCB.StopBits = ONESTOPBIT;//停止位 • SetCommState(hSerial, &PortDCB);//写DCB
超时控制 • 为了防止意外情况使串口读写无休止地等待,超时设置由COMMTIMEOUTS 结 构定义 。 • 通过调用GetCcommTimeOuts 函数获得当前的设置。 • 用SetCommTimeOuts 函数来完成设置。
超时控制的代码 • COMMTIMEOUTS CommTimeouts; • GetCommTimeouts(m_hSerial, &CommTimeouts); 获得当前超时参数 • CommTimeouts.ReadIntervalTimeout = MAXDWORD; • CommTimeouts.ReadTotalTimeoutMultiplier = 10; • CommTimeouts.ReadTotalTimeoutConstant = 10; • CommTimeouts.WriteTotalTimeoutMultiplier = 50; • CommTimeouts.WriteTotalTimeoutConstant = 100; • SetCommTimeouts(hSerial, &CommTimeouts); 设置当前超时参数
发送超时控制 • ReadIntervalTimeout 是指两个字符传送之间的超时时间。 • 一次读操作的超时时间等于要接收的字符数 乘以ReadTotalTimeoutMultiplier ,再加上ReadTotalTimeoutConstant。
发送超时控制 • WriteIntervalTimeout 是指两个字符传送之间的超时时间。 • 一次写操作的超时时间等于要发送的字符数 乘以WriteTotalTimeoutMultiplier ,再加上WriteTotalTimeoutConstant。
数据传输 • 读写串行端口与读写文件采用的函数相同,即ReadFile、WriteFile。 • Windows CE不支持重叠IO操作,也称异步操作,当有多个线程进行IO操作时,应用程序可以使用WaitCommEvent函数阻塞线程,直至发生特定的通讯事件,以协调多个线程。
发送数据的代码 • 发送数据用以下命令完成 • WriteFile (hSerial, &Byte, nByte, &dwNumBytes, NULL); • 其中 • hSerial 句柄 • &Byte 数据缓冲区地址 • nByte 数据大小 • &dwNumBytes 返回发送出去的字节数 • NULL 不支持重叠
接收数据 • 串口编程最复杂的部份就是接收数据。 • 串口接收数据常常通过创建一个线程来完成。 • 接收线程既要考虑及时的读取数据,还要解决接收到的数据的处理工作。
关闭串口 • 程序的终止可以自动关闭串口,也可用函数CloseHandle(),以便释放所占资源。
扩展蓝牙 • PXA270的三个串口中,有一个是专为接入蓝牙模块设计的,这个串口也是一个标准的串口。 • 将蓝牙模块接入,按照标准的串口编程方式编程。
扩展GSM/GPRS • 将GSM/GPRS 模块接入串口。 • 安装串口驱动程序。 • 利用标准的AT指令对GSM/GPRS模块编程。
扩展GPS • 将GPS模块接入串口。 • 安装串口驱动程序。 • 利用GPS测试程序,观察通过串口接收到的卫星信息。