为什么串口通信中发送一次数据接收到两次

为什么读取的时候没有返回ERROR_IO_PENDING??还有就是为什么我在接受数据的时候每次都会触发两次接受数据事件,第一次什么也就收不到,读取到0个字符,第二次才会接受到数据
CString com_str="COM3";
hCom=CreateFile(com_str,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);

void CComDlg::OnReceive(WPARAM w,LPARAM l)
{
char buffer[1024];
DWORD rec=1024;
DWORD haveread;
DWORD err;
COMSTAT ctat;
OVERLAPPED overead;

memset(&buffer,0,sizeof(buffer));
memset(&overead,0,sizeof(OVERLAPPED));
overead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

ClearCommError(hCom,&err,&ctat);
rec=min(rec,ctat.cbInQue);
BOOL red=ReadFile(hCom,buffer,rec,&haveread,&overead);
//为什么这里直接返回TRUE而不是返回FALSE
if (!red)
{
if (GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(hCom,5000);
buffer[haveread]='\0';
ShowMessage(buffer);
}
else
{
CString s;
s.Format("ReadFile Error NO:%ld",GetLastError());
AfxMessageBox(s);
}
}
else
{
//这里是测试用,每次就收数据的时候都会先接受0个字符再接受数据
CString t;
t.Format("%d",haveread);
AfxMessageBox(t);

ShowMessage(buffer);
}

}

CString CComDlg::SetCom(HANDLE h, int bote, int shujuwei, float tingzhiwei)
{
//////////////砞竚DCB////////////////////////////////////
DCB d;
if (GetCommState(h,&d))
{
d.DCBlength=sizeof(DCB);
d.BaudRate=(DWORD)bote;
d.fBinary=TRUE;
d.ByteSize=(BYTE)shujuwei;
if (tingzhiwei==1)
{
d.StopBits=ONESTOPBIT;
}
else if (tingzhiwei==1.5)
{
d.StopBits=ONE5STOPBITS;
}
else if (tingzhiwei==2)
{
d.StopBits=TWOSTOPBITS;
}
d.fParity=FALSE;
d.Parity=NOPARITY;

if (!SetCommState(h,&d))
{
return "DCB SET FAILED";
}
}
/////////////////砞竚 禬///////////////////////////
COMMTIMEOUTS t;
t.ReadIntervalTimeout=MAXDWORD;
t.ReadTotalTimeoutConstant=0;
t.ReadTotalTimeoutMultiplier=0;
t.WriteTotalTimeoutConstant=5000;
t.WriteTotalTimeoutMultiplier=500;
if (!SetCommTimeouts(h,&t))
{
return "TIMEOUT SET FAILED";
}

/////////////////砞竚 絯//////////////////////////////////
if (SetupComm(h,1024,1024))
{
PurgeComm(h,PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR);
}
else
{
return "Set Buffer Failed";
}

//////////////////砞竚 ㄆン////////////////////////////////////
if (!SetCommMask(h,EV_RXCHAR|EV_ERR))
{
return "COM Event Set Failed";
}

return "OK";
}

和触发阈值有关,不过接收几次不是Bug,应该通过缓存把接收到的数据先存起来,在其他线程中分析数据。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-01-06
关注这个问题
相似回答