使用ReadFile读取串口数据报错!
使用ReadFile读取串口数据出错!!!!!!!!!!!!!!!!!!!!
大致流程是这样的
1.以异步通信的方式打开一个串口
2.初始化设置
3.设置一个定时器在定时器里面反复读取缓冲区数据
代码编译没有问题,但是ReadFile一直提示失败,GetLastError提示997 重叠 I/O 操作在进行中。在效果上确实是异步I/O,但是读不数是为啥?
------解决方案--------------------
ReadFile作为一个异步操作,直接返回结果,所以当你在取400字节数据操作返回的时候是ERROR_IO_PENDING(997)的状态,说明数据还在传输中,这是正常情况。下面我们要做的就是等待它传输完成。
大致流程是这样的
1.以异步通信的方式打开一个串口
2.初始化设置
3.设置一个定时器在定时器里面反复读取缓冲区数据
代码编译没有问题,但是ReadFile一直提示失败,GetLastError提示997 重叠 I/O 操作在进行中。在效果上确实是异步I/O,但是读不数是为啥?
//打开串口设备正常==============================
hPort = CreateFile (TEXT(strCOM),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, //FILE_FLAG_OVERLAPPED
NULL);
ZeroMemory(&overlapped,sizeof(overlapped));//overlapped是OVERLAPPED结构体
hevent=CreateEvent(NULL,TRUE,TRUE,NULL); //HANDLE hevent
overlapped.hEvent=hevent;
//设置波特率超时等===========================
GetCommState(hPort,&Dcb);
Dcb.BaudRate =CBR_19200;
Dcb.ByteSize =8;
Dcb.Parity =NOPARITY;
Dcb.StopBits =ONESTOPBIT;
SetCommState(hPort,&Dcb);
GetCommTimeouts(hPort,&CommTimeouts);
........................
SetCommTimeouts(hPort,&CommTimeouts);
//设置计时器在定时器里面读取数据=====================================
SetTimer(1,1000,NULL);
//读取数据==============该部分代码在计时器中===========
if(ReadFile(hPort,comBuf,400,&readedlen,&overlapped){
..............................
else{
int error==GetLastError();//error一直得到997 重叠 I/O 操作在进行中。
}
------解决方案--------------------
ReadFile作为一个异步操作,直接返回结果,所以当你在取400字节数据操作返回的时候是ERROR_IO_PENDING(997)的状态,说明数据还在传输中,这是正常情况。下面我们要做的就是等待它传输完成。
if(ReadFile(hPort,comBuf,400,&readedlen,&overlapped){
..............................
else{
if(GetLastError()==ERROR_IO_PENDING)
{
bool bResult = GetOverlappedResult(hPort,&overlapped,&readedlen,TRUE);
if(!bResult)
AfxMessageBox("error");
}
else
AfxMessageBox("error");
}