Python讀取串口數(shù)據(jù)的實(shí)現(xiàn)方法
1.編程流程
串口數(shù)據(jù)流程為,
1.實(shí)例化串口連接,
2.初始化設(shè)置連接屬性,
3.連接串口硬件,
4.讀取傳輸緩存區(qū)的串口數(shù)據(jù)。
使用Python的serial庫(kù)進(jìn)行讀寫串口數(shù)據(jù)。
pip3 install serial
技巧:重復(fù)運(yùn)行上述pip指令,可輸出當(dāng)前serial依賴庫(kù)的存放位置。
參考教程:http://chabaoo.cn/article/170801.htm.
2.應(yīng)用serial庫(kù)
分析1中功能流程,進(jìn)行如下匯總:
- 串口連接配置1:實(shí)例化串口連接
- 串口連接配置2:配置串口參數(shù),并連接串口
- 串口連接配置3:讀取串口數(shù)據(jù)
- 加上功能:核驗(yàn)接收數(shù)據(jù)
3.編碼設(shè)計(jì)
將上面的功能,進(jìn)行如下進(jìn)行設(shè)計(jì):
- 串口參數(shù)配置設(shè)為變量,初始化串口連接時(shí)進(jìn)行調(diào)用
- 讀取串口數(shù)據(jù),寫入文件
- 判斷:串口數(shù)據(jù)數(shù)據(jù)格式,每包數(shù)據(jù)長(zhǎng)度
4.編程實(shí)現(xiàn)
編寫函數(shù),實(shí)現(xiàn)讀取串口操作
def msg_list(): # 新建一個(gè)列表,返回該串口數(shù)據(jù),做后續(xù)數(shù)據(jù)處理使用 msg_list = list() # 準(zhǔn)備一個(gè)文件,保存數(shù)據(jù) r = r'E:\py\0.txt' write_file = open(r, 'wb') # 配置串口名稱、比特率、超時(shí)時(shí)間 port = 'COM3' bps = 1152000 timex = 1 # 連接串口 ser = serial.Serial(port, bps, timeout=timex) print(ser) # 等下時(shí)間,去啟動(dòng)串口發(fā)送程序。不然,程序會(huì)直接進(jìn)入判斷串口數(shù)據(jù)直接結(jié)束 time.sleep(3) # 進(jìn)入讀寫過(guò)程 while True: # 判斷當(dāng)前寫入?yún)^(qū)有沒(méi)有串口數(shù)據(jù) if ser.in_waiting: # 讀數(shù)據(jù) msg = ser.readall() # 寫入數(shù)據(jù)到文件里 write_file.write(msg) # 將數(shù)據(jù)轉(zhuǎn)成16進(jìn)制數(shù),存入列表中 msg_list = list(msg.hex) else: # 當(dāng)串口寫入緩存區(qū)沒(méi)數(shù)據(jù),關(guān)閉串口和文件,結(jié)束讀寫操作 ser.close() write_file.close() break # 保存的串口數(shù)據(jù)列表做這次函數(shù)的返回值 return msg_list
有了一組串口數(shù)據(jù),后續(xù)就可以自定義發(fā)揮了。
if __name__ == '__main__': a = msg_list() # 由于我的發(fā)串口程序是發(fā)16進(jìn)制的固定長(zhǎng)度為160的數(shù)據(jù)包,所以進(jìn)行按固定長(zhǎng)度分割列表。列表里的索引就為每一個(gè)數(shù)據(jù)包的次序。 # 補(bǔ)充,串口配置默認(rèn)是按每8bit位讀?。膳渲茫栽跀?shù)據(jù)里,一包總長(zhǎng)度為160 * 2 = 320 a1 = [a[i:i+162*2]] for i in range(0, len(items), 162*2) # 判斷下,每幀串口數(shù)據(jù)頭是否正確 # 由于緩存區(qū)存在內(nèi)存大小限制。預(yù)估在結(jié)尾容易發(fā)生丟包,所以加個(gè)長(zhǎng)度判斷 for i in range(0, len(a1)): if a1[i][0:4] = ['a', 'b', 'c', 'd'] and len(a[i]) == 160*2: pass else: # 輸出第一次不正確的上下行數(shù)據(jù) print('到了', i) print(a1[i-1]) print(a1[i]) break
到此這篇關(guān)于Python讀取串口數(shù)據(jù)的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Python讀取串口數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中串口通信庫(kù)pyserial基礎(chǔ)知識(shí)
- python讀取串口數(shù)據(jù)有幾種方法
- python serial串口通信示例詳解
- 玩轉(zhuǎn)串口通信:利用pyserial庫(kù),Python打開無(wú)限可能
- Python通過(guò)串口實(shí)現(xiàn)收發(fā)文件
- Python串口通信的接收與發(fā)送的實(shí)現(xiàn)
- python實(shí)現(xiàn)串口通信的示例代碼
- Python?Serial串口的簡(jiǎn)單數(shù)據(jù)收發(fā)方式
- 使用Python玩轉(zhuǎn)串口(基于pySerial問(wèn)題)
- python串口讀取數(shù)據(jù)的實(shí)例
- 使用 Python 列出串口的實(shí)現(xiàn)方法
- Python中串口操作的實(shí)現(xiàn)示例
相關(guān)文章
利用Python實(shí)現(xiàn)個(gè)性化日歷
雖然市面上已經(jīng)存在現(xiàn)成的日歷功能,并且有第三方庫(kù)可以直接調(diào)用實(shí)現(xiàn),但我們?nèi)匀幌Mㄟ^(guò)自己編寫日歷程序來(lái)引出我認(rèn)為好用的日歷實(shí)現(xiàn),所以下面就跟隨小編一起學(xué)習(xí)一下如何使用Python編寫一個(gè)簡(jiǎn)單的日歷程序吧2024-02-02NumPy數(shù)組創(chuàng)建方法與索引訪問(wèn)詳解
這篇文章主要介紹了NumPy數(shù)組創(chuàng)建方法與索引訪問(wèn),NumPy 中的核心數(shù)據(jù)結(jié)構(gòu)是 ndarray,它代表多維數(shù)組,NumPy 提供了多種方法來(lái)創(chuàng)建 ndarray 對(duì)象,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-05-05Python第三方庫(kù)之OpenCV庫(kù)的實(shí)用指南
OpenCV(Open Source Computer Vision Library)作為一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),提供了豐富的圖像處理和計(jì)算機(jī)視覺(jué)功能,本文將帶領(lǐng)讀者使用Python編程語(yǔ)言,通過(guò)簡(jiǎn)單的代碼示例,初步掌握OpenCV的圖像處理技術(shù),需要的朋友可以參考下2024-09-09簡(jiǎn)單的編程0基礎(chǔ)下Python入門指引
這篇文章主要介紹了簡(jiǎn)單的編程0基礎(chǔ)下Python入門指引,包括從各個(gè)系統(tǒng)的Python安裝和簡(jiǎn)單的語(yǔ)句知識(shí),需要的朋友可以參考下2015-04-04解決jupyter運(yùn)行pyqt代碼內(nèi)核重啟的問(wèn)題
這篇文章主要介紹了解決jupyter運(yùn)行pyqt代碼內(nèi)核重啟的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python中生成一個(gè)指定長(zhǎng)度的隨機(jī)字符串實(shí)現(xiàn)示例
這篇文章主要介紹了Python中生成一個(gè)指定長(zhǎng)度的隨機(jī)字符串,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11