无法将数据写入串行端口

时间:2016-08-20 19:05:31

标签: c++ qt sockets bluetooth

我正在尝试将数据写入串行端口。我用这种方式:

 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):( null):0((null)):qt.bluetooth.android: Socket :: writeData:QBluetoothSocket :: ConnectingState false

W / libA_for_w8.so(6443):( null):0((null)):qt.bluetooth.android:  Socket :: writeData:QBluetoothSocket :: ConnectingState false

D / libA_for_w8.so(6443):.. \ A_for_w8 \ widget.cpp:68(void Widget :: on_plus_clicked()): - 1

D / libA_for_w8.so(6443):

所以,没有写到那里。 似乎代码还可以,但它不起作用。 你能告诉我什么是错的吗? 谢谢。

P.S。

我检查套接字是否打开。 socket-&gt; isOpen返回true,我得到: W / libA_for_w8.so(9638):( null):0((null)):qt.bluetooth.android:Socket :: writeData:QBluetoothSocket :: UnconnectedState false

D / libA_for_w8.so(9638):.. \ A_for_w8 \ widget.cpp:70(void Widget :: on_plus_clicked()): - 1

1 个答案:

答案 0 :(得分:2)

您需要先将套接字连接到端点,然后才能成功写入任何内容。某处必须有正在运行的蓝牙服务,您可以使用connectToService()连接到该服务。发出connected()信号后,您可以写入数据。

QBluetoothSocket似乎没有waitForConnected()函数,QAbstractSocket及其子类。这意味着您可以使用QSignalSpy之类的东西来等待connected()信号,或者,如果您不太关心效率,那么只需要一个繁忙的等待循环。

编辑:

正如评论中指出的那样,等待事件发生是Qt主要事件循环的重点。使用waitFor*方法或其他事件循环是非常低效的,并且肯定违背Qt的精神。因此,仅在连接套接字后写入数据的最佳解决方案是将writeData()个插槽连接到connected() QBluetoothSocket信号。