2014-03-28 62 views
1

我正在Qt creator C++和linux os上工作,我試圖創建讀取和發送sms消息的程序。一切工作正常,但當我嘗試讀取cmti信號,表明收到新消息,它剎車和操作系統發送給我SIGBUS,總線錯誤。當從gsm調制解調器接收CMTI信號時,應用程序崩潰

我的代碼很簡單:

port->setPortName(s); 

bool status = port->open(QSerialPort::ReadWrite); 

if(status) 
{ 
    port->setBaudRate(115200, QSerialPort::AllDirections); 
    port->setDataBits(QSerialPort::Data8); 
    port->setParity(QSerialPort::NoParity); 

    QByteArray in; 

    if(port->waitForReadyRead(300)) 
     { 
      in = port->readAll(); 
      while (port->waitForReadyRead(64)) 
      { 
       in += in->readAll(); 
      } 
     } 

    //... 
} 

當調制解調器發送CMTI和端口獲取信號端口 - > watiForReadyRead()它給了我的錯誤,並不會繼續端口 - > readAll()。另外,當這個錯誤發生時它改變調制解調器的ttyUSB端口。

我最好的猜測是調制解調器阻止端口,所以我的應用程序可以閱讀。在寡婦的c#中,我已經通過設置串口讀超時來解決這個問題,但是我不能在qt中這樣做。

任何人都可以幫忙嗎?

回答

2

您必須始終在特定給定的串行接口上​​明確啓用您想要收聽的所有不同的UR代碼。如果您有多個串行接口打開並在其中一個接口上運行AT+CNMI=2,則不能認爲+CNMI: ...將在運行AT + CNMI命令的接口上出現。假設你打開,關閉然後重新打開,任何東西都不會被記住。

所以,在你上面的代碼中,添加一個調用寫AT + CNMI你想要的模式,然後read and parse一切你從MODEN回來,直到你的代碼期待繼續之前得到OK最終結果代碼收到+CNMI: ... UR代碼。 (順便說一下,你應該使用readLine而不是readAll,因爲AT命令響應應該一直按行處理。)

+0

感謝您的指導,設置了AT + CNMI = 2,1,0,0,0。 – user2880783

相關問題