我编写了以下串行读取函数,该函数应该等待引发EV_RXCHAR
事件,之后它应该以连续循环读取
void CGCUGUIDlg::OnStartcom()
{
m_hComm = ::CreateFile(Com, //String that contains COM port name
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0
);
fnCommState();
DCB dcb = {0};
dcb.DCBlength = sizeof(dcb);
Status = GetCommState(m_hComm, &dcb);
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
SetCommState(m_hComm, &dcb);
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;
DWORD NoBytesRead;
BYTE abBuffer[100];
fSuccess = SetCommMask(m_hComm,EV_RXCHAR);
if(!fSuccess)
{
MessageBox("SetCommMask failed with error %s",LPCTSTR(GetLastError()));
return;
}
o.hEvent = CreateFile(0,0,0,NULL,TRUE,FALSE,NULL);
o.Internal = 0;
o.InternalHigh = 0;
o.Offset = 0;
o.OffsetHigh = 0;
assert(o.hEvent);
for(;;)
{
if(WaitCommEvent(m_hComm,&dwEvtMask,&o)) //if 1
{
if(dwEvtMask & EV_RXCHAR) //if 2
{
do
{
ReadFile(m_hComm,&abBuffer,sizeof(abBuffer),&NoBytesRead,&o);
data.Append(LPCTSTR(abBuffer),NoBytesRead);
}//do
while(NoBytesRead>0);
if((data.GetAt(1)==10)&& data.GetLength() == 100) //if 3, EDIT 1
{
result = data;
this->SetDlgItemText(IDC_RXRAW,LPCTSTR(result));
this->UpdateDate(false); //EDIT 2
}//if 3
}//if 2
}//if 1
Sleep(40);
}//for
}
一些细节:
1应用程序每60毫秒接收100个字节,这100个字节中的字节之间没有间隙。
2指定了头字节,所以我正在检查这个和消息大小。
3 data
和result
都是CString
个变量。
4虽然我没有完全复制代码,但我确实将代码大量放在了here给出的监控代码上。这就是我使用Overlapped方法的原因,即使我只是在阅读数据。
代码编译好(大呐,我知道)但是在调用函数时运行应用程序时会挂起。我正在使用this emulator发送数据。
有人可以指出我工作中的错误吗?
更新: 我试图找出问题的原因,所以我试着检查是否正在调用EV_RXCHAR事件。我运行了以下严格缩短的代码:
for(;;)
{
if(WaitCommEvent(m_hComm,&dwEvtMask,0)) //if 1
{
if(dwEvtMask & EV_RXCHAR) //if 2
{
MessageBox("Data");
break;
}
break;
}
else
MessageBox("No Data");
break;
}//for
我收到的数据,处理数据的代码太可怕了。我开始研究这个了。
更新2:仍然在努力,任何输入都将受到高度赞赏。