为什么我的串行读取应用程序没有响应?

时间:2017-06-08 05:51:24

标签: c++ mfc serial-port

我编写了以下串行读取函数,该函数应该等待引发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 dataresult都是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:仍然在努力,任何输入都将受到高度赞赏。

0 个答案:

没有答案