同步读写串口很简单,异步读写串口有几个地方需要注意,以例子说明:
1. 打开串口
HANDLE m_hCom;
m_hCom = CreateFile(_T("COM1"),
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //同步方式填0 ,此处需要注意
NULL);
if( m_hCom==INVALID_HANDLE_VALUE)//(HANDLE)-1
{
AfxMessageBox(_T("打开COM失败!"));
}
//设置输入输出缓冲区大小
SetupComm(m_hCom,1024,512);
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
//注意设小后读不到数据
TimeOuts.ReadTotalTimeoutMultiplier = 50;
TimeOuts.ReadTotalTimeoutConstant = INFINITE;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 50;
TimeOuts.WriteTotalTimeoutConstant = INFINITE;
SetCommTimeouts(m_hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(m_hCom,&dcb);
dcb.BaudRate = 2400; //波特率为
dcb.ByteSize = 8; //每个字节有位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = TWOSTOPBITS; //2个停止位TWOSTOPBITS
dcb.fBinary = TRUE;
SetCommState(m_hCom,&dcb);
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
2. 读取串口(写串口类似)
//接收缓冲区
unsigned char buff[32];
memset(buff,0,32);
//读取的字节数
DWORD dwReadBytes = 32;
//读取字节数
DWORD dwWriteBytes = 32;
//异步读写串口
OVERLAPPED m_overlp;
//创建通知事件
m_overlp.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//异步读写串口数据,
unsigned long dataLength = 0;
bool bReadState = ReadFile(m_hCom,buff,dwReadBytes,&dwReadBytes,&pThis->m_overlp);
//等待读取完成,超时为2秒,INFINITE为永不超时
WaitForSingleObject(m_hCom,,2000);
//取出数据长度
//取得串口数据的长度,异步方式这样获取数据的长度,而不是使用dwReadBytes返回的值,
//异步操作时dwReadBytes返回的值为0,同步操作时才可这样取得数据长度,需要特别注意!!!
dataLength = m_overlp.InternalHigh;