1. 程式人生 > 其它 >Linux串列埠讀取與解析

Linux串列埠讀取與解析

技術標籤:ARM-Linux與嵌入式

串列埠協議包的接收及解析處理

對於串列埠接收問題前面之前有文章介紹過串列埠快取機制的應用。當然這裡不應用快取機制也是完全可行的。這裡我們講解基於不帶串列埠快取機制的處理。對於串列埠接收我們最常用的方式就是在串列埠中斷中接收資料。

利用串列埠接收資料包資訊大致分為下面三種情況:

  1. 接收一幀資料,對幀資料進行處理(可以利用串列埠接收非空中斷和串列埠空閒中斷實現)
  2. 中斷中邊接收邊處理儲存,並將有效資料儲存起來,再對有效資料進行解析。
  3. 將接收到的資料全部存入快取,從快取中提取資料並做處理。

第11課.串列埠(UART)的使用

1.UART連線圖

S3C2440有3個獨立通道的UART

2.資料傳輸流程

1.平時資料線處於“空閒”狀態(1狀態)
2.當要傳送資料時,UART改變TxD資料線的狀態(變為0狀態),並維持1位的時間,這樣接收方檢測到開始位後,在等待1.5位的時間就開始一位一位的檢測資料線的狀態得到所傳輸的資料
3.UART一幀中可以有5,6,7或8位的資料,傳送方一位一位的改變資料線的狀態將它們傳送出去。首先發送最低位
4.如果使用校驗功能,UART在傳送完資料位後,還要傳送1個校驗位。有兩種校驗方法:奇校驗,偶校驗——資料位連同校驗位,“1”的數目等於奇數或偶數
5.最後,傳送停止位。資料線恢復到“空閒”狀態(1狀態)。停止位的長度有3種:1位,1.5位,2位

正是由於這種機制,沒有干擾的情況下,傳送每個位元組都能讀到。

Linux讀取串列埠資料

問題背景

大致為:有一個傳送端週期性的往本機串列埠上傳送資料,本機需要定時讀取串列埠資料,解析,獲取自己想要的資訊。實際描述為:由於是做智慧駕駛的,需要讀取車輛速度,通過OBD裝置讀取並解析車輛速度,然後通過藍芽傳送給PC串列埠(也是通過一個藍芽模組接收),PC端串列埠定時接收串列埠資料並解析。

在上述過程中,有一個問題需要注意:傳送方是週期性的不停的傳送資料,也就是說PC機串列埠一直有資料進來,最常見的是傳送端頻率比接收端頻率高,即準備讀取串列埠資料時總可以讀取的資料,但也也導致了另一個問題,那就是怎麼處理接收端串列埠緩衝,因為你每次的讀取操作都必須要把當前串列埠緩衝區中資料全部讀取出來,不能只讀一部分,不然傳送端一直有資料進來,而你每次都不讀玩,就會造成緩衝區溢位。

串列埠的實質是什麼

但凡接觸過Linux系統知識或者瞭解計算機系統原理,那你一定通過一句話“在任何作業系統下,一切都是檔案”,Linux系統就是這句話的最完美的實現,即在Linux系統下,你完全可以把所有東西當成是一個檔案、即所有東西都可以按照“開啟——設定——讀寫——關閉”的模式進行,同樣,在Linux下串列埠也可以看成是一種檔案(其實任何作業系統下都可以這樣認為),你要讀寫串列埠資料,就必須先開啟、設定串列埠,然後讀寫,讀寫完畢,就必須要關閉串列埠。

從串列埠緩衝區裡讀資料,其實和開啟txt檔案讀資料一樣,可以一次讀幾個位元組,也可以全讀出來。

(1)開啟串列埠:

在ReadCarSpeed.cpp檔案中,OpenCom()函式負責開啟和設定串列埠,這裡有一點需要囉嗦一下:myCom->setTimeout(50);延時設定函式,我這裡設定的是50ms,對於這個延時,我的理解是本機串列埠的接收頻率,注意這個接收頻率是不同於你讀取的頻率的,這裡的接收頻率是本機串列埠緩衝區接收資料的延時,即沒50ms就有一個數據進去接收緩衝區佇列(要理解資料緩衝區實際就是一個佇列,先進先出),而你讀取的頻率是你呼叫readAll()函式的頻率,如我的讀取頻率就是主控程式的頻率(大約為500ms),所以每次大約讀取10個速度資訊。

緩衝區(buffer)與快取(cache)

一、什麼是緩衝區

緩衝區(buffer),它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區,顯然緩衝區是具有一定大小的。

緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區。

二、為什麼要引入緩衝區

我們為什麼要引入緩衝區呢?

高速裝置與低速裝置的不匹配,勢必會讓高速裝置花時間等待低速裝置,我們可以在這兩者之間設立一個緩衝區。

緩衝區的作用:

1.可以解除兩者的制約關係,資料可以直接送往緩衝區,高速裝置不用再等待低速裝置,提高了計算機的效率。例如:我們使用印表機列印文件,由於印表機的列印速度相對較慢,我們先把文件輸出到印表機相應的緩衝區,印表機再自行逐步列印,這時我們的CPU可以處理別的事情。

2.可以減少資料的讀寫次數,如果每次資料只傳輸一點資料,就需要傳送很多次,這樣會浪費很多時間,因為開始讀寫與終止讀寫所需要的時間很長,如果將資料送往緩衝區,待緩衝區滿後再進行傳送會大大減少讀寫次數,這樣就可以節省很多時間。例如:我們想將資料寫入到磁碟中,不是立馬將資料寫到磁碟中,而是先輸入緩衝區中,當緩衝區滿了以後,再將資料寫入到磁碟中,這樣就可以減少磁碟的讀寫次數,不然磁碟很容易壞掉。

簡單來說,緩衝區就是一塊記憶體區,它用在輸入輸出裝置和CPU之間,用來儲存資料。它使得低速的輸入輸出裝置和高速的CPU能夠協調工作,避免低速的輸入輸出裝置佔用CPU,解放出CPU,使其能夠高效率工作。

小草手把手教你 LabVIEW 串列埠儀器控制——VISA 串列埠配置

串列埠有個緩衝區,存在計算機記憶體裡,VISA讀取,就是從緩衝區讀取資料,讀完之後,讀取的就不存在緩衝區裡了。如果你沒讀取,那就一直在緩衝區裡,直到緩衝區溢位。其實就好比一個水桶,寫 VISA 是往水桶進水,讀 VISA 是出水。你也可以想想佇列的原理,差不多的。