大致為:有乙個傳送端週期性的往本機串列埠上傳送資料,本機需要定時讀取串列埠資料,解析,獲取自己想要的資訊。實際描述為:由於是做智慧型駕駛的,需要讀取車輛速度,通過obd裝置讀取並解析車輛速度,然後通過藍芽傳送給pc串列埠(也是通過乙個藍芽模組接收),pc端串列埠定時接收串列埠資料並解析。
在上述過程中,有乙個問題需要注意:傳送方是週期性的不停的傳送資料,也就是說pc機串列埠一直有資料進來,最常見的是傳送端頻率比接收端頻率高,即準備讀取串列埠資料時總可以讀取的資料,但也也導致了另乙個問題,那就是怎麼處理接收端串列埠緩衝,因為你每次的讀取操作都必須要把當前串列埠緩衝區中資料全部讀取出來,不能唯讀一部分,不然傳送端一直有資料進來,而你每次都不讀玩,就會造成緩衝區溢位。
但凡接觸過linux系統知識或者了解計算機系統原理,那你一定通過一句話「在任何作業系統下,一切都是檔案」,linux系統就是這句話的最完美的實現,即在linux系統下,你完全可以把所有東西當成是乙個檔案、
即所有東西都可以按照「開啟——設定——讀寫——關閉」的模式進行,同樣,在linux下串列埠也可以看成是一種檔案(其實任何作業系統下都可以這樣認為),你要讀寫串列埠資料,就必須先開啟、設定串列埠,然後讀寫,讀寫完畢,就必須要關閉串列埠。
四、ubantu下qt 串列埠資料讀取程式
看了他的**之後,可能你已經大致明白了,他的操作流程完全是按照
「開啟——設定——讀寫——關閉」的操作模式來操作串列埠的,其「開啟和設定」過程都是在mainwindow的建構函式裡面進行的,「讀取」操作其實就是乙個函式readall(),為了實現定時讀取,需要與乙個qtimer connect,其實你完全可以不用定時器(在他的說明裡面說的是必須要用定時器),
定時器的功能是什麼?不就是定時觸發其所關聯的函式嗎?其實質是你要定期呼叫readall()函式,你完全可以自己控制這個定時操作,即可以在你的主函式裡面週期性呼叫readall()函式就行了,最常見的,如果你要一直度,就在while(1)迴圈裡面呼叫readall()函式,
「關閉」操作是在mainwindow的析構函式裡面呼叫的。
由於我的qt工程比較大,不是只有一兩個編譯模組,所以我是自己呼叫的readall()函式,並沒有與qtimer進行關聯,因為我有乙個主控程式(其實也就是mian函式啊),所以就在主控程式裡面呼叫的readall()函式,實現週期性的讀取串列埠資料,我的讀取車輛速度檔案如下:
readcarspeed.h
#ifndef readcarspeed_h
#define readcarspeed_h
void opencom(); //開啟、設定串列埠
void readspeed(); //讀取、解析資料,關閉操作也是在退出介面時呼叫
#endif // readcarspeed_h
readcarspeed.cpp
#include "readcarspeed.h"
#include "posix_qextserialport.h"
extern int carspeed;
posix_qextserialport *mycom;
void opencom()
void readspeed()
在readcarspeed.cpp檔案中,opencom()函式負責開啟和設定串列埠,這裡有一點需要囉嗦一下:mycom->settimeout(50);延時設定函式,我這裡設定的是50ms,對於這個延時,我的理解是本機串列埠的接收頻率,注意這個接收頻率是不同於你讀取的頻率的,這裡的接收頻率是本機串列埠緩衝區接收資料的延時,即沒50ms就有乙個資料進去接收緩衝區佇列(要理解資料緩衝區實際就是乙個佇列,先進先出),而你讀取的頻率是你呼叫
readall()函式的頻率,如我的讀取頻率就是主控程式的頻率(大約為500ms),所以每次大約讀取10個速度資訊。
readspeed()函式中首先是呼叫readall()函式讀取緩衝區中全部資料,然後解析資料,上面說過,每次讀取操作大約讀取了10個速度資訊(或者更多),而我需要的是最新的車速資訊,而緩衝區佇列中最新的車速資訊是佇列中的最後乙個速度,所以只提取qbytearray中的最後乙個速度,這通過c++的字元搜尋(匹配)實現,具體可以查閱c++primer(第五版p325)。這裡qbytearray就是乙個位元組陣列,可以儲存任何資料,它的用法可以檢視qt assistant文件。
總之,在我的應用中,首先是呼叫一次opencom函式,開啟並設定串列埠,然後週期性的呼叫readspeed函式(其實質就是週期性的呼叫readall函式)就能讀取最新的車速資訊。
讀取串列埠資料
void uartbuf wd uartbuf ringbuf,uint8 t datain d今天移植一段 的時候看到乙個挺有意思的寫法 如上 這是一段微控制器讀取串列埠資料的函式,一開始看到的時候我很是懵比,要我以前寫的話或者看的大多數程式都是乙個簡單的迴圈賦值到緩衝陣列,索引達到陣列的size...
讀取串列埠資料
讀取串列埠資料 2017年06月01日 12 10 39 閱讀數 700 cpp view plain copy cpp view plain copy void uartbuf wd uartbuf ringbuf,uint8 t datain d今天移植一段 的時候看到乙個挺有意思的寫法 如上 ...
示波器顯示讀取串列埠資料
波特率115200,說明每個byte 1 115200 8.6ns 示波器 1g s 示波器能夠使用的最大取樣速率為1g樣本 秒,就是說示波器在時間最小檔位是的取樣率是每秒採集1g個資料點,時間檔位越大用到的取樣率越小。100mhz 示波器模擬前端的頻寬。100m正弦波輸入示波器時,進過模擬前端後訊...