簡體   English   中英

串口接收字節時發出信號

[英]Emitting signal when bytes are received in serial port

我正在嘗試使用Boost庫在C ++中連接信號和插槽。 我的代碼當前打開一個文件並從中讀取數據。 但是,我正在嘗試改進代碼,以便它可以使用串行端口實時讀取和分析數據。 我想做的是只有當串行端口中有可用數據時才調用分析功能。

我將如何去做呢? 我之前在Qt中已經做過,但是我不能在Qt中使用信號和插槽,因為此代碼未使用其moc工具。

在處理串行端口時,您的OS(Linux)為您提供以下機制。

您可以將串行端口設置為非規范模式(通過在termios結構中取消ICANON標志)。 然后,如果c_cc[]中的MINTIME參數為零,則當且僅當串行端口輸入緩沖區中有新數據時, read()函數才會返回(有關詳細信息,請參見termios手冊頁)。 因此,您可以運行一個單獨的線程來負責獲取傳入的串行數據:

ssize_t count, bytesReceived = 0;
char myBuffer[1024];
while(1)
{
    if (count = read(portFD, 
        myBuffer + bytesReceived, 
        sizeof(myBuffer)-bytesReceived) > 0)
    {
     /*
       Here we check the arrived bytes. If they can be processed as a complete message,
       you can alert other thread in a way you choose, put them to some kind of 
       queue etc. The details depend greatly on communication protocol being used.
       If there is not enough bytes to process, you just store them in buffer
      */
         bytesReceived += count;
         if (MyProtocolMessageComplete(myBuffer, bytesReceived))
         {
              ProcessMyData(myBuffer, bytesReceived);
              AlertOtherThread(); //emit your 'signal' here
              bytesReceived = 0;  //going to wait for next message
         }
    }
    else
    {
     //process read() error
    }
}

這里的主要思想是,僅當新數據到達時,調用read()的線程才處於活動狀態。 其余時間,操作系統將使該線程保持等待狀態。 因此,它不會消耗CPU時間。 如何實現實際的signal部分取決於您。

上面的示例使用常規的read系統調用從端口獲取數據,但是您可以以相同的方式使用boost類。 只需使用同步讀取功能,結果將是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM