使用Python讀取串列埠資料

2021-10-25 11:36:33 字數 2289 閱讀 9198

串列埠資料流程為,

1.例項化串列埠連線,

2.初始化設定連線屬性,

3.連線串列埠硬體,

4.讀取傳輸快取區的串列埠資料。

使用python的serial庫進行讀寫串列埠資料。

pip3 install serial
技巧:重複執行上述pip指令,可輸出當前serial依賴庫的存放位置。

參考教程:

分析1中功能流程,進行如下彙總:

串列埠連線配置1:例項化串列埠連線串列埠連線配置2:配置串列埠引數,並連線串列埠串列埠連線配置3:讀取串列埠資料加上功能:核驗接收資料
將上面的功能,進行如下進行設計:

串列埠引數配置設為變數,初始化串列埠連線時進行呼叫讀取串列埠資料,寫入檔案判斷:串列埠資料資料格式,每包資料長度
編寫函式,實現讀取串列埠操作
def

msg_list()

:# 新建乙個列表,返回該串列埠資料,做後續資料處理使用

msg_list =

list()

# 準備乙個檔案,儲存資料

r = r'e:\py\0.txt'

write_file =

open

(r,'wb'

)# 配置串列埠名稱、位元率、超時時間

port =

'com3'

bps =

1152000

timex =

1# 連線串列埠

ser = serial.serial(port, bps, timeout=timex)

print

(ser)

# 等下時間,去啟動串列埠傳送程式。不然,程式會直接進入判斷串列埠資料直接結束

time.sleep(3)

# 進入讀寫過程

while

true

:# 判斷當前寫入區有沒有串列埠資料

if ser.in_waiting:

# 讀資料

msg = ser.readall(

)# 寫入資料到檔案裡

write_file.write(msg)

# 將資料轉成16進製制數,存入列表中

msg_list =

list

(msg.

hex)

else

:# 當串列埠寫入快取區沒資料,關閉串列埠和檔案,結束讀寫操作

ser.close(

) write_file.close(

)break

# 儲存的串列埠資料列表做這次函式的返回值

return msg_list

有了一組串列埠資料,後續就可以自定義發揮了。

if __name__ ==

'__main__'

: a = msg_list(

)# 由於我的發串列埠程式是發16進製制的固定長度為160的資料報,所以進行按固定長度分割列表。列表裡的索引就為每乙個資料報的次序。

# 補充,串列埠配置預設是按每8bit位讀取(可配置),所以在資料裡,一包總長度為160 * 2 = 320

a1 =

[a[i:i+

162*2]

]for i in

range(0

,len

(items)

,162*2

)# 判斷下,每幀串列埠資料頭是否正確

# 由於快取區存在記憶體大小限制。預估在結尾容易發生丟包,所以加個長度判斷

for i in

range(0

,len

(a1)):

if a1[i][0

:4]=

['a'

,'b'

,'c'

,'d'

]and

len(a[i])==

160*2:

pass

else

:# 輸出第一次不正確的上下行資料

print

('到了'

, i)

print

(a1[i-1]

)print

(a1[i]

)break

讀取串列埠資料

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今天移植一段 的時候看到乙個挺有意思的寫法 如上 ...

Linux讀取串列埠資料

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