1. 程式人生 > >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);

相關推薦

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

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

QT 串列QSerialPort + 解決接收資料完整問題

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

linux多執行緒下開啟串列傳送和接收資料

1 啟動執行緒1讀串列埠 2 等待3秒後 3 啟動執行緒2寫串列埠,傳送字串後關閉 4 等待10秒 5 關閉兩個執行緒 #include <pthread.h> #include <stdio.h> #include <sys/time.h> #include &

串列通訊中,解決serialport.DataReceived接收到的資料完整

private SerialPort serialport = new SerialPort(); private StringBuilder builder = new StringBuilder(); // private String

Qt--串列接收資料,自定義碼流

串列埠通訊,傳送的資料沒有打包成固定碼流,所有需要對接收的資料加以判斷。 解決串列埠接收不完整的方法有3種: 一:判斷接收的資料,是不是自己定義的字元格式。 二:判斷接收的資料包大小,是不是自己定義的資料包的大小。 三:以多執行緒的方式,執行緒一直接收,資料獨立處理,此方法

Qt串列通訊第三方類flush函式能清空串列解決辦法

       有網友也提到qt第三方類的flush函式不好用的觀點,我最近正好在做一個程式,自己起一個讀執行緒一個寫執行緒,通過切換變數控制讀寫,就像單刀雙置開關一樣。沒辦法,對方的通訊協議定的這樣,不過這種辦法雖隨不是非同步通訊,但保障了安全,兩個執行緒絕對不會串在一起,

QT串列助手(三):資料接收

> 作者:zzssdd2 > > E-mail:[email protected] # 一、前言 開發環境:**Qt5.12.10 + MinGW** > 實現的功能 - 串列埠資料的接收 - ascii字元形式顯示與hex字元形式顯示 - 時間戳的顯示 -

串列解決方案:關於下載工程後字型顯示的相關問題

關於在串列埠屏中出現下載工程後字型沒顯示出來的情況有兩種: 一是使用者建立新字型的時候,沒有建立相應的ASCII碼字型或者是這個字型編碼是否支援,這個體現為在虛擬屏和實體屏均沒有顯示; 二是客戶那邊生成的字型是正確的,在虛擬屏裡面可以正常顯示,但是在實體屏中卻顯示不出來。 3.1字型編碼有誤

QSerailPort使用readAll()接收資料全問題解決

編譯環境:Qt Creater        畢設需要編寫一個上位機程式,用來顯示採集的資料,採用串列埠通訊,在使用QSerialPort傳送資料正常,接受資料時,發現串列埠傳送資料不穩,解包的時候發現數據不是自己想要的。為此我想了兩種辦法來解決。 方法一:      

串列協議的制定以及串列中怎樣接收一個完整資料包的解析

裡以串列埠作為傳輸媒介,介紹下怎樣來發送接收一個完整的資料包。過程涉及到封包與解包。設計一個良好的包傳輸機制很有利於資料傳輸的穩定性以及正確性。串列埠只是一種傳輸媒介,這種包機制同時也可以用於SPI,I2C的匯流排下的資料傳輸。在微控制器通訊系統(多機通訊以及PC與微控制器

串列中怎樣接收一個完整資料包的解析

方法1:串列埠接受資料,定時器來判斷超時是否接受資料完成。方法2:DMA接受+IDLE中斷實現思路:採用STM32F103的串列埠1,並配置成空閒中斷IDLE模式且使能DMA接收,並同時設定接收緩衝區和初始化DMA。那麼初始化完成之後,當外部給單片機發送資料的時候,假設這幀資

verilog語言RS232串列接收模組設計——串列除錯工具傳送資料在數碼管顯示

RS-232是常用的傳輸介面,是硬體學習的入門級介面。 一、介面特性 DE-9 Male (Pin Side) DE-9 Female (Pin Side) -------------

STM32 HAL庫學習系列第10篇---串列空閒中斷接收不定長資料

串列埠重定向配置: 可以直接複製使用 /************************************************* * 函式功能: 重定向c庫函式printf到DEBUG

HKEY_LOCAL_MACHINE:hardware\DeviceMap\SerialComm裡找串列解決辦法

開始選單-->執行-->輸入:regedit; 開啟登錄檔,依次找到HKEY_LOCAL_MACHINE\hardware\DeviceMap\SerialComm; 若有com值,將名稱欄\Device\ProlificSerial0改為\Device\Ser

在MCU中,如何實現串列的不定長資料接收

在MCU的應用中,經常需要通過串列埠進行不定長資料包的傳輸。傳送方很簡單,不需特別的考慮,而接收

串列轉USB傳輸資料過快導致電腦宕機問題的解決

問題現象:使用串列埠轉USB資料線連線電腦和串列埠裝置,當串列埠裝置長時間快速傳送資料時,電腦會卡死(藍屏或是不能再識別到COM口) 問題分析:應該是windows下的USB轉串列埠線的驅動有問題

win10找串列解決方法

1.如果電腦安裝了虛擬機器,有可能串列埠被佔用,從虛擬機器的usb 裝置勾選掉串列埠的usb,即可在Windows系統上顯示串列埠2.裝置管理器串列埠欄有黃色歎號。將驅動解除安裝,重新安裝驅動,PL-2303 Vista Driver Installer。分享下載連結:htt

keil編譯的程式 “漢字顯示全、串列傳送漢字接收後亂碼缺失”問題

今天知道一個keil的bug,就是當漢字的機內碼包含0xfd時,keil就會自動丟棄fd,mark一下。 解決方法: 1、遇到帶有fd的漢字採用機內碼替代, 2.給keil打補丁。具體過程可百度

51微控制器串列通訊的幀資料接收

首先定義一個數據幀格式,Header :{ 0xAA 0x55} type:{ 0x01 | 0x02 | 0x03 } length:{  N } body :{____n個位元組的資料___ } 資料的格式就是上面的定義  Header 為幀頭 標記一個數據幀的開始,t

STM32的串列空閒中斷接收不定長資料

按照此文的方法實現了串列埠的收發,但是實際使用中發現: 接收空閒中斷的產生是在資料接收停止一個位元組時產生的,但是有時由於上位機編寫問題或硬體問題(本人用到的USB轉串列埠的硬體有問題)上位機發送資料不連續,中間有時間間隔大於一個位元組,從而造成無法完整接收資料。通過對