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輔助調試
解決接收資料不完整問題
- 不完整的原因:分開多次接收,這個你很難控制得了;
- 解決辦法:首先嚴格定義頭部和尾部;然後把處理邏輯寫完整,一個都不能漏;
- 下面定義頭部為”{“,尾部為”}”,變量類型全部為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);