接上一篇文章使用VC2010实现基于MSComm32控件的串口通讯,本篇文章介绍一下如何使用Windows API接口来实现串口通讯的功能。
注:串口通讯可以实现同步和异步两种方式,这里本人主要介绍的是串口的异步通讯。
和直接MSComm32控件的接口不同,若使用Windows API接口来实现串口通讯的话,若想深刻的认识其中的道理,则我们需要了解我们所需要的API接口的功能。读者除了借鉴本篇文章的介绍之外,还需要不断地百度和MSDN一下相关的知识,因为只有这样才能明白其中的奥秘。当然,若读者只是图个使用的话,那就没那个必要了。
在此,本人介绍一下实现串口通讯功能需要用到的一些API接口。
一、打开串口操作及设置串口
1、CreateFile() 该函是一个多功能的函数,除了可以打开和创建我们常用的文件之外,还可以用于对I/O设备的操作,在对串口进行操作之前,就需要先用该函数来打开串口。
volatile HANDLE m_hCom;
m_hCom = ::CreateFile(strCom, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
这里值得注意的是必须使用“OPEN_EXISTING”来打开,因为串口是已经存在的设备;
由于我们要实现异步操作串口,所以得加上“FILE_FLAG_OVERLAPPED”参数。
2、SetCommMask() 该函数用于设置我们要在串口上监听的事件,一般要设置“EV_RXCHAR|EV_TXEMPTY”,这个参数组合表示在串口 “输入缓冲区中已收到数据,即接收到一个字节并放入输入缓冲区”和“输出缓冲区中的数据已被完全送出”这两种情况下会触发串口事件。当然你也可以不使用此函数来设置串口监听事件,而在你觉得必要的时候再进行串口操作。
::SetCommMask(m_hCom, EV_RXCHAR|EV_TXEMPTY)
3、SetupComm() 该函数可以设置串口的输入和输出缓冲区的大小。
4、PurgeComm() 该函数可以用于终止当前的串口操作并清空串口缓冲区。
::SetupComm(m_hCom, MAX_BUFFER, MAX_BUFFER);
::PurgeComm(m_hCom,
PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
5、SetCommTimeouts() 该函数用于设置串口操作超时,涉及到的参数为主要有结构体COMMTIMEOUTS
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; /* Maximum time between read chars. */