2016-08-20 48 views
1

我正在嘗試將數據寫入串行端口。我用這樣的方式:無法將數據寫入串行端口

QBluetoothSocket *socket; 
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); 
    socket->open(QIODevice::WriteOnly); 
     QByteArray byteArr; 
      QDataStream out(&byteArr, QIODevice::WriteOnly); 
      out << 1 << '\n';  //if plusbutton is pushedm then send zero 
      socket.write(byteArr); 
      qDebug()<<socket.write(byteArr)<<endl; 

但我得到的回報:

W/libA_for_w8.so(6443):(空):0((空)):qt.bluetooth.android: 插座::寫數據:QBluetoothSocket :: ConnectingState假

W/libA_for_w8.so(6443):(空):0((空)):qt.bluetooth.android: 插座::寫數據:QBluetoothSocket :: ConnectingState假(6443):.. \ A_for_w8 \ widget.cpp:68(void Widget :: on_p lus_clicked()):-1

d/libA_for_w8.so(6443):

所以,沒有數據被寫入到那裏。 看來,代碼是好的,但它不起作用。 你能告訴我什麼是錯的嗎? 謝謝。

P.S.

我檢查套接字是否打開。 (null):0((null)):qt.bluetooth.android:Socket :: writeData:QBluetoothSocket :: UnconnectedState false

d/libA_for_w8.so(9638):.. \ A_for_w8 \ widget.cpp:70(無效的Widget :: on_plus_clicked()):-1

+2

_「看來,代碼是好的,但它不起作用。」_呃? –

+0

您沒有單行代碼來檢查possibe運行時錯誤或類似情況。 –

+0

嗯,我沒有說,代碼是100%正確的,但我個人並沒有在這裏看到錯誤,讓我們這樣說吧。 「你沒有單行代碼來檢查possibe運行時錯誤或類似」 - 如何做? – John

回答

2

您需要,然後才能成功的套接字連接到端點寫任何東西。某個地方必須有一個正在運行的藍牙服務,您使用connectToService()進行連接。在發出connected()信號後,您可以寫入數據。

似乎並沒有QBluetoothSocketwaitForConnected()函數,因爲QAbstractSocket及其子類做。這意味着您可以使用類似QSignalSpy等信號等待connected()信號,或者,如果您不關心效率,只需要一個忙碌等待循環即可。

編輯:

正如評論指出的那樣,等待事件發生的是Qt的主事件循環的關鍵所在。使用waitFor*方法或其他事件循環相當低效,肯定違背了Qt的精神。因此,只有在套接字連接後才能寫入數據的解決方案是將writeData()插槽連接到的connected()信號。

+1

這是正確的,只是在非測試代碼中使用'QSignalSpy'的建議是可怕的。 'waitFor'方法缺乏,因爲它們表現糟糕,導致人們寫意大利麪代碼。**您通過將您的代碼(插槽/函子)連接到它們而對信號作出反應,而不是等待它們明確!事件循環做的是等待:這是它唯一的工作。**你不會等待事情發生,你讓代碼在發生時運行。更乾淨,更好的表現。 –

+0

好點@KubaOber,我更新了我的答案。我建議忙碌等待,主要是因爲OP的其他職位都帶有「waitFor *」斑點,所以我認爲這很容易理解。 – bnaecker