2016-08-20 4 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: ソケット:: WRITEDATA:QBluetoothSocket :: ConnectingState偽

D/libA_for_w8.so(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:ソケット:: writeData:QBluetoothSocket :: UnconnectedState false

このスレッドに返信します...返信>

D/libA_for_w8.so(9638):.. \ A_for_w8 \ widget.cpp:70(無効ウィジェット:: on_plus_clicked()):-1あなたが成功したことができる前にエンドポイントにソケットを接続する必要が

+2

_ "コードは問題ありませんが、うまくいかないようです。" –

+0

ランタイムエラーなどの可能性をチェックするコードは一切ありません。 –

+0

まあ、私は言っていない、コードは100%正しいですが、私は個人的にここでエラーが表示されない、このようにそれを入れてみましょう。 "ランタイムエラーなどの可能性をチェックするコードは一切ありません" - その方法は? – John

答えて

2

何かを書く。 connectToService()を使用して接続先のBluetoothサービスが実行されている必要があります。 connected()シグナルが放出された後、データを書き込むことができます。

QBluetoothSocketwaitForConnected()という機能を持っているとは思われません。QAbstractSocketとそのサブクラスがあります。これはQSignalSpyのようなものを使用してconnected()シグナルを待つことができることを意味します。効率についてあまり気にしない場合は、ビジーウェイトループだけが行います。

EDIT:

としては、イベントが発生するのを待つことはQtのメインイベントループの全体のポイントで、コメントで指摘しました。 waitFor*のメソッドや別のイベントループを使用することはかなり非効率的であり、Qtの精神に反しています。したがって、ベストソケットが接続された後にデータを書き込む解決策は、connected()信号のQBluetoothSocketwriteData()スロットを接続することです。

+1

これは正しいですが、テストコード以外で 'QSignalSpy'を使用することの提案は恐ろしいものです。 'waitFor'メソッドはパフォーマンスに害があり、スパゲッティコードを書く人々を導くため、欠けています。**コード(スロット/ファンクタ)を明示的に待つのではなく、それらに接続することによって、シグナルに反応します。イベントループは待っています:それは唯一の仕事です**事態が起こるのを待たずに、コードが実行されるようにしましょう。よりクリーンで、はるかに優れたパフォーマンス。 –

+0

良い点@KubaOber、私は私の答えを更新しました。私は忙しい待つことを提案しました。なぜなら、OPには、waitFor *が付いた他の投稿がありました。私はそれが簡単に消化できると思っていました。 – bnaecker

関連する問題