C++ 为什么我的串行读取应用程序没有响应?
我编写了下面的串行读取函数,该函数应该等待C++ 为什么我的串行读取应用程序没有响应?,c++,mfc,serial-port,C++,Mfc,Serial Port,我编写了下面的串行读取函数,该函数应该等待EV\u RXCHAR事件被触发,之后它应该以连续循环的方式读取 void CGCUGUIDlg::OnStartcom() { m_hComm = ::CreateFile(Com, //String that contains COM port name GENERIC_READ|GENERIC_WRITE, 0, 0
EV\u 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数据
和结果
都是CString
变量
4虽然我没有直接复制代码,但我的代码在很大程度上是基于给定的监控代码。这就是为什么我使用重叠方法,即使我只读取数据
代码编译得很好(我知道这是个大问题),但在运行时,调用函数时应用程序会挂起。我正在使用发送数据
有人能指出我工作中的错误吗
更新:
我试图找出问题的原因,因此我试图检查是否调用了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:仍在进行中,任何输入都将不胜感激。您确定
数据。GetAt(1)==10 | | 80
做了您希望它做的事吗=
的优先级高于| |
,因此它是(data.GetAt(1)==10)| | | 80
@GSerg我将代码更改为只检查10
)。我将找出一个不同的表达式来检查两者。我正在发送一条如下开头的消息:1010ffffff
以此类推100字节。它仍然挂起。代码有太多错误,你必须扔掉它。for(;;)循环没有转义,因此UI线程将始终挂起。重叠I/O需要CreateEvent句柄,WaitCommEvent()将始终失败。如果没有将重叠I/O与有用的工作重叠,那么使用重叠I/O是没有意义的。将字节强制转换为LPCTSTR无法工作,它不是以零结尾的字符串。每秒用1.7KB的文本拍打用户的眼睛是没有用的。使用一个工作线程去做一些事情,集中精力处理数据。@HansPassant谢谢您的输入。你提到的大部分观点我都理解。您能否解释一下您所说的需要CreateEvent句柄的重叠I/O,以及为什么WaitCommEvent总是失败?我试图检查这是否是真的,但事实并非如此。此外,我还没有编写代码来处理这些数据,因此用户不必担心不断更新的数据会轰炸用户。这只是一个测试代码,看看我是否可以进行串行读取。