最近一个项目才把Windows下如何用API来进行串口操作了解的比较清楚,现在总结几个关键点。其中主要是总结超时控制,整个串口操作的过程可以参考MSDN的“Serial Communications in Win32”。
一 同步操作方式和异步操作方式
所谓同步和异步,是指是否会阻塞操作串口的线程,同步会阻塞,异步不会阻塞,所以异步又叫重叠,也就是串口操作在后台进行,程序后面的语句可以和串口操作重叠执行。同步和异步,与整个程序是否是多线程无关,只会影响到进行串口操作的线程。
二 读串口的超时控制方法
异步方式读串口的超时控制的关键点:
1. 用SetCommTimeouts函数设置串口超时时间。
该函数第二个参数是指向COMMTIMEOUTS结构的指针,该结构各个成员的设置是超时控制的关键,说明如下:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; // 各个字符之间的读间隔超时。收到第1个字符之后该超时才生效。如果超时之后没收到第二个字符,串口读操作将结束。
DWORD ReadTotalTimeoutMultiplier; // 读时间系数
DWORD ReadTotalTimeoutConstant; // 读时间常量。总超时 = 要读取的字节数 x 读时间系数 + 读时间常量。
DWORD WriteTotalTimeoutMultiplier; // 写时间系数
DWORD WriteTotalTimeoutConstant; // 写时间常量
} COMMTIMEO