6.3.3具体实现方法
下面以C++ Builder为例,叙述PC机通信软件的实现过程:
(1)打开串口
在Win32中,串口和其他通信设备是作为文件处理的。串口的打开并闭读取以及写入所用的函数与操作文件的函数相同。
通信会话由调用CreateFile 函数打开串口开始,CreateFile 以读访问权限,写访问权限或读写访问权限“打开串口”并设定了对其是异步操作方式。还是同步操作方式调用该函数打开串口进行读写操作的例子如下:
mHandle = CreateFile(lpszPort, //串口名
GENERIC_READ|GENERIC_WRITE, //允许读/写
0, //独占方式串口不能共享
NULL, //安全性属性一般设为0
OPEN_EXISTING, //串口是已存在的不能建新端口
lpOverlapped, //异步方式
0 //串口无模板文件应设为0
);
如果调用成功函数返回串口的句柄赋给Handle,如果调用失败则函数返回INVALID_HANDLE_VALUE。
(2)初始化串口
对串口的初始化工作包括对波特率,数据位,停止位,奇偶校验位I/O 缓冲大小以及超时等参数的设置。在调用API 函数进行串口初始化时,波特率,数据位,奇偶校验停止位的信息包含于一个DCB结构中,而超时方面的信息则包含于COMMTIMEOUTS结构中,
一般在用CreateFile 打开串行口后,可以调用GetCommState 函数来获取串行口的初始配置。要修改串行口的配置应该先修改DCB结构,然后再调用SetCommState函数用指定的DCB结构来设置串行口。例如:
DCB dcb;
GetCommState(mHandle, &dcb) //读取DCB结构
……………………
……………………
dcb.BaudRate=9600 // 设置波特率为9600b/s
dcb.ByteSize=8; // 每个字符有8位
dcb.Parity=NOPARITY; // 无校验
dcb.StopBits=ONESTOPBIT; // 一个停止位
SetCommState(hCom, &dcb) // 保存至DCB结构使设置值生效
调用SetupComm 函数可以设置串行口的输入和输出缓冲区的大小。如果通信的速率较高则应该设置较大的缓冲区。例如:
…………………………
…………………………
SetupComm( mHandle , 1024*2, 1024*2 ) //输入输出缓冲区的大小均为2K
…………………………
…………………………
在用ReadFile 和WriteFile 读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile 或WriteFile 的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts 函数。该函数会填充一个COMMTIMEOUTS 结构调用SetCommTimeouts 可以用某一个COMMTIMEOUTS结构的内容来设置超时。
…………………………
…………………………
TimeOuts. ReadIntervalTimeout=0 //读间隔超时
TimeOuts.ReadTotalTimeoutMultiplier=10 //读时间系数
TimeOuts.ReadTotalTimeoutConstant=100 //读时间常量
TimeOuts.WriteTotalTimeoutMultiplier=10 //写时间系数
TimeOuts.WriteTotalTimeoutConstant=100 //写时间常数
SetCommTimeouts(hCom, &TimeOuts); // 保存设置值生效
………………………………
………………………………
………………………………
COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+ 时间常数
异步方式读写串行口时虽然ReadFile()和WriteFile() 在完成操作以前就可能返回但超时仍然是起作用的。这种情况下,超时规定的是操作的完成时间而不是ReadFile()和WriteFile()的返回时间。
(3)读写串口
初始化工作完成以后便可以根据通信协议合理安排读/写函数ReadFile()和WriteFile()以读写各种握手信息和数据信息等。其中何时读取单片机发送过来的数据信息及应答信息是重要的。此时采取的是事件驱动法,即:设置通信资源上的事件掩码为EV_RXCHAR 。当接收到一个字符并放入缓冲区后即通知应用程序例。
//PC发送一组命令至单片机
WriteFile(mHandle, //串口句柄
pDataBuff, //存放数据缓种区
iLen, //所写数据的长度
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>