1. 程式人生 > >【轉】QT 串列埠QSerialPort + 解決接收資料不完整問題

【轉】QT 串列埠QSerialPort + 解決接收資料不完整問題

類:QSerialPort

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

//讀串列埠
QByteArray QSerialPort::readAll()
//寫串列埠
qint64 QSerialPort::write(const QByteArray &data)
1
2
3
4
注意事項: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
};
1
2
3
4
5
6
7
8
9
10
11
12
qt底層是呼叫windows sdk api,其支援256000波特率

除錯相關:使用虛擬串列埠軟體vspd輔助除錯

解決接收資料不完整問題

轉:貼吧 http://tieba.baidu.com/p/3699753033?pn=2 45樓

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);
---------------------
作者:Kelvin_Ngan
來源:CSDN
原文:https://blog.csdn.net/kelvin_yan/article/details/78975147
版權宣告:本文為博主原創文章,轉載請附上博文連結!