2013-08-02 147 views
4

我正在編寫一個Qt應用程序,通過串行端口與另一臺計算機通信。我有兩個真正的問題。Qt串行端口通信

1. 我可以很好地發送和接收數據,但有時串口「吃」了我輸入的一部分。 例如,如果我派:

cd /application/bin 

有時(並不總是)它只會收到:

cd /applica 

(因爲它是與之呼應的輸入背端也是我及時告訴我,我顯然是在錯誤的地方。)

2. 此外,有時Qt的插槽中時,有可用不火,即使我知道,有我可以接收數據數據時觸發。如果我沿着端口發送另一個\r\n,則插槽將會閃光。 例如有時我會ls東西,命令名將從端口讀回,但文件夾的內容坐在那裏,直到我再次打回來。然後我得到目錄的列表和兩個提示。

這裏是我的代碼:

void Logic::onReadyRead(){   
     QByteArray incomingData; 
     incomingData = port->readAll(); 
     QString s(incomingData); 
     emit dataAvailable(s);// this is a Qt slot if you don't know what it is. 
     qDebug() << "in:"<< s.toLatin1();  
} 

void Logic::writeToTerminal(QString string) 
{ 
    string.append("\r\n"); 
    port->write((char*)string.data(), string.length()); 
    if (port->bytesToWrite() > 0){ 
     port->flush(); 
    } 
    qDebug() << "out:" << string.toLatin1(); 
} 
+0

我剛剛意識到它可能不明確,這些都是無關的問題。 Shell會告訴我它不能進入​​'/ applica',因爲不存在這樣的目錄 – Muricula

+0

您需要緩衝從端口讀取的數據,直到遇到可能需要從端口多次讀取的 。 – Pete

回答

2

我找到了解決辦法,我懷疑這是一個編碼錯誤,但我不知道。而不是發送串行端口的QString,發送一個QByteArray解決了這兩個問題。我改變了writeToTerminal()方法:

void Logic::writeToTerminal(QString string) 
{ 
    string.append("\r"); 
    QByteArray ba = string.toAscii(); 
    port->write(ba); 
} 
0

this forum,似乎有時不是所有的數據被髮送,並且不管用什麼方法獲取發送有「\ 0」附加到它。所以,如果

CD/APPLICA「\ 0」 被罰,那麼port->readAll()會停在那裏,因爲它認爲它已經讀到的一切。

該論壇上的一個建議答案是逐行閱讀,您的代碼差不多。所以我覺得在你的情況,你可以更改您的代碼:

void Logic::onReadyRead(){   
    QByteArray incomingData; 
    if(port->canReadLine()) { 
     incomingData = port->readLine(); 
     QString s(incomingData); 
     emit dataAvailable(s);// this is a Qt slot if you don't know what it is. 
     qDebug() << "in:"<< s.toLatin1(); 
    }  
} 

void Logic::writeToTerminal(QString string) 
{ 
    string.append("\r\n"); 
    port->write((char*)string.data(), string.length()); 
    if (port->bytesToWrite() > 0){ 
     port->flush(); 
    } 
    qDebug() << "out:" << string.toLatin1(); 
} 
+1

我建議不要盲目地從QByteArray轉換爲QString,反之亦然,無需指定編碼。例如。寫時:'QByteArray data = s.toUtf8(); //顯式轉換爲UTF-8';並檢查返回值:'const qint64 written = port-> write(data.constData(),data.length());' –

+0

@maditya,我曾嘗試逐行閱讀,但它沒有解決我的問題。它的工作比'port-> readAll()'要糟糕一點' – Muricula