天天看點

基于linux平台使用QSerialPort注意事項

問題現象:

m_serialPort->write()//這句正常
connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(slot_receiveInfo()));//整死都沒有進入槽裡面
           

描述:

Qt5.1開始,開發序列槽應用使用的是QSerialPort和QSerialPortInfo。網上很多例程,但是基本都是windows平台,基于linux平台的序列槽較少,但差別又不大。這次遇到一個小坑,QSerialPort的應用在windows使用正常,但是移植到linux平台,就是接收不了資料。示波器發現我每寫一次序列槽,序列槽也回了資料,說明QSerialPort的寫是沒問題的,但是就是readyRead信号觸發不了,一次也不能!改用純linuxC平台的序列槽方式就讀寫資料正常。在一個群裡問了些大佬,竟然有說QSerialPort移植到linux正常跑過的,也有遇到我這個問題的。估計跟linux有關系。是以這句代碼:

在windows是沒問題的,理應在linux平台使用QSerialPort和QSerialPortInfo的話,讀取部分得修改為不斷去m_serialPort->readAll()。結果,也不行!!!通過示波器發現write正常,序列槽也傳回了資料。額,等于輪訓去read也不行。無奈抛棄QSerialPort方式,換成其他序列槽開發方式。

其他

1.Qt開發序列槽方式:①QSerialPort ②Posix_QextSerialPort ③linuxC的檔案描述符方式

示例代碼

關鍵代碼:

/*
@ 該序列槽方法是三方插件Posix_QextSerialPort 方法
@ Bluetooth是自定義類
@ 序列槽讀、寫在同一個分離的線程裡
*/
    //藍牙序列槽線程
    BLE_COM = new Bluetooth(QString("/dev/ttySGK1"),QIODevice::ReadWrite,BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF);

    /*綁定讀取序列槽槽*/
    connect(BLE_COM,SIGNAL(signal_readFromSerial(QByteArray)),this,SLOT(slot_test_readFromSerial(QByteArray)));

    //往藍牙子產品寫指令
    emit BLE_COM->signal_writeToSerial("AT+GVERS\r\n");

           

Qt的使用方式:

#添加子子產品

include ($$PWD/Bluetooth_com/Bluetooth_com.pri)

//包含頭檔案

#include “Bluetooth_com/serialportwidget.h”

資源下載下傳

Bluetooth_com.tar.gz

繼續閱讀