天天看點

QT序列槽QSerialPort解決接收資料不完整問題QT序列槽QSerialPort解決接收資料不完整問題

QT序列槽QSerialPort解決接收資料不完整問題

QSerialPort類例程:Examples\Qt-5.9.1\serialport\terminal,該例子完美展示了qt序列槽收發過程,直接在這上面修改就可以得到自己的序列槽軟體。核心方法:

//讀序列槽

QByteArray QSerialPort::readAll()

//寫序列槽

qint64 QSerialPort::write(const QByteArray &data)

注意事項:qt預設最大支援115200波特率,可以通過修改:

Qt5.9.1\5.9.1\msvc2013_64\include\QtSerialPort\qserialport.h

    enum BaudRate {

        Baud1200 = 1200,

        Baud2400 = 2400,

        Baud4800 = 4800,

        Baud9600 = 9600,

        Baud19200 = 19200,

        Baud38400 = 38400,

        Baud57600 = 57600,

        Baud115200 = 115200,

        Baud256000 = 256000,  //添加256000波特率

        UnknownBaud = -1

    };

qt底層是調用windows sdk api,其支援256000波特率。

調試相關:使用虛拟序列槽軟體vspd輔助調試

解決接收資料不完整問題

  1. 不完整的原因:分開多次接收,這個你很難控制得了;
  2. 解決辦法:首先嚴格定義頭部和尾部;然後把處理邏輯寫完整,一個都不能漏;
  3. 下面定義頭部為”{“,尾部為”}”,變量類型全部為QByteArray。

BufferData = MySerialPort->readAll();

//異常類:無頭且變量為空,已丢失頭部,資料不可靠,直接傳回

if ((!BufferData.contains("{"))&(PasteData.isNull()))

{

return;

}

//第一種:有頭無尾,先清空原有内容,再附加

if ((BufferData.contains("{"))&(!BufferData.contains("}")))

{

PasteData.clear();

PasteData.append(BufferData);

}

//第二種:無頭無尾且變量已有内容,資料中段部分,繼續附加即可

if ((!BufferData.contains("{"))&(!BufferData.contains("}"))&(!PasteData.isNull()))

{

PasteData.append(BufferData);

}

//第三種:無頭有尾且變量已有内容,已完整讀取,附加後輸出資料,并清空變量

if ((!BufferData.contains("{"))&(BufferData.contains("}"))&(!PasteData.isNull()))

{

PasteData.append(BufferData);

ReadData = PasteData;

PasteData.clear();

}

//第四種:有頭有尾(一段完整的内容),先清空原有内容,再附加,然後輸出,最後清空變量

if ((BufferData.contains("{"))&(BufferData.contains("}")))

{

PasteData.clear();

PasteData.append(BufferData);

ReadData = PasteData;

PasteData.clear();

}

ui.textEdit->setText(ReadData);