我编了一个函数,在接收数据时,comstat.cbinQue有数据,但是ReadFile()没执行,每次读到的数都是0。请各位帮忙看看,这件事比较急,做不出来老师会k我的。
BOOL CComserialApp::OnEditStart()
{
// TODO: Add your command handler code here
DCB dcb;
//打开串口,得到串口句柄
hCOM=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(hCOM==INVALID_HANDLE_VALUE)
return false; //初始化串口,READBUFFER,WRITEBUFFER是用户自己定义的
SetupComm(hCOM,1024,1024);
PurgeComm(hCOM,PURGE_TXCLEAR|PURGE_RXCLEAR); //设置DCB参数
if(!GetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
//设置超时值
COMMTIMEOUTS to;
to.ReadIntervalTimeout=MAXDWORD;
to.ReadTotalTimeoutConstant=0;
to.ReadTotalTimeoutMultiplier=0;
to.WriteTotalTimeoutConstant=0;
to.WriteTotalTimeoutMultiplier=0;
if(!SetCommTimeouts(hCOM,&to))
{
CloseHandle(hCOM);
return false;
}
//用事件驱动方式需设置事件代码
if(!SetCommMask(hCOM,EV_RXCHAR))
{
CloseHandle(hCOM);
return false;
}
//等待事件触发
DWORD dwEvent,dwError;
DWORD nRealRead,i;
OVERLAPPED overlapped;
dwEvent=dwError=0;
if(WaitCommEvent(hCOM,&dwEvent,&overlapped))
{
ClearCommError(hCOM,&dwError,&comstat);
if((dwEvent&&EV_RXCHAR)&&comstat.cbInQue)
ReadFile (hCOM,inBuffer,comstat.cbInQue,&nRealRead,NULL);
}
BOOL CComserialApp::OnEditStart()
{
// TODO: Add your command handler code here
DCB dcb;
//打开串口,得到串口句柄
hCOM=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(hCOM==INVALID_HANDLE_VALUE)
return false; //初始化串口,READBUFFER,WRITEBUFFER是用户自己定义的
SetupComm(hCOM,1024,1024);
PurgeComm(hCOM,PURGE_TXCLEAR|PURGE_RXCLEAR); //设置DCB参数
if(!GetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(!SetCommState(hCOM,&dcb))
{
CloseHandle(hCOM);
return false;
}
//设置超时值
COMMTIMEOUTS to;
to.ReadIntervalTimeout=MAXDWORD;
to.ReadTotalTimeoutConstant=0;
to.ReadTotalTimeoutMultiplier=0;
to.WriteTotalTimeoutConstant=0;
to.WriteTotalTimeoutMultiplier=0;
if(!SetCommTimeouts(hCOM,&to))
{
CloseHandle(hCOM);
return false;
}
//用事件驱动方式需设置事件代码
if(!SetCommMask(hCOM,EV_RXCHAR))
{
CloseHandle(hCOM);
return false;
}
//等待事件触发
DWORD dwEvent,dwError;
DWORD nRealRead,i;
OVERLAPPED overlapped;
dwEvent=dwError=0;
if(WaitCommEvent(hCOM,&dwEvent,&overlapped))
{
ClearCommError(hCOM,&dwError,&comstat);
if((dwEvent&&EV_RXCHAR)&&comstat.cbInQue)
ReadFile (hCOM,inBuffer,comstat.cbInQue,&nRealRead,NULL);
}
这个时候需要根据 getlasterror的返回情况进行处理的
{ OVERLAPPED osRead;
memset(&osRead,0,sizeof(OVERLAPPED));
COMSTAT ComStat;
DWORD dwLength, dwBytesRead;
DWORD dwErrorFlags;
osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
::ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?
if(dwLength>0)
{
LPBYTE lpBuffer = new BYTE[dwLength];
BOOL fReadStat;
fReadStat = ReadFile( hCom,
lpBuffer,
dwLength,
&dwBytesRead,
&osRead); //读数据 DWORD dwError;
if (!fReadStat)
{
dwError=GetLastError();
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,
&osRead, & dwBytesRead, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue; //缓冲区数据没有读完,继续
}
}
}
delete[] lpBuffer;
}
我决得可以用READFILE一个一个字节的读,而不是一次读一大
段,你就应该自己知道所受到的缓冲大小。
把READFILE放在一个WHILE(1)的循环中,
unsigned inbuff0[1];
unsigned inbuff[number];
DWORD len = 1;int ix = 0;
while(1)
{
readfile(hCOM,inbuff0,len,&len,null);
inbuff[ix] = inbuff[0];
if(ix++==number)break;
}当然最好另开一个线程读数据。
你写的一大段代码都可砍掉。
设置通讯事件,等待通讯事件,超时,通通砍掉!
number 是你应要接受的数据大小
inbuff也应动态分配。
number 是你应要接受的数据大小
inbuff也应动态分配。