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总是失败?我试图检查这是否是真的,但事实并非如此。此外,我还没有编写代码来处理这些数据,因此用户不必担心不断更新的数据会轰炸用户。这只是一个测试代码,看看我是否可以进行串行读取。