Python之串口收發(fā)的異步程序
Python串口收發(fā)的異步程序
進行Python串口程序開發(fā)時,一般使用 pyserial 模塊。這是個同步方式運行的庫。
串口運行時,收發(fā)等待的時間較多,使用異步方式開發(fā)可以提高開發(fā)效率和運行效率。
為了進行異步編程,可以使用一個建立在 asyncio 基礎(chǔ)上的異步串口程序模塊,即pyserial_asyncio 模塊。
在使用這個模塊時,我們發(fā)現(xiàn),網(wǎng)上資料中,能夠獨立直接運行的簡單實例較少。
為此,我們編寫了一個簡單的可以獨立運行的實例,以方便讀者使用這個模塊。
下面是這個程序的完整代碼
可以在 python 3.9 及以后的版本上運行。
注意:
編程和運行前要安裝 pyserial_asyncio 模塊。
import asyncio import serial_asyncio import time # 接收異步函數(shù),收到后打印時間、收到的內(nèi)容和接收的序號 async def read_from_serial(reader): count = 0 while True: data = await reader.read(1000) p = time.strftime("%X", time.localtime()) print(f'received at {p}, {data.decode()}, serial = {count}') count += 1 # 發(fā)送異步函數(shù),每隔兩秒鐘發(fā)送一次 async def write_to_serial(writer): while True: writer.write(b'hello') await writer.drain() await asyncio.sleep(2) async def main(): # 連接串口,其中的'/dev/cu.usbserial-1140'是串口的名稱, # windows 的串口名一般是 'comx' 的格式,例如:'com3; # linux 的串口格式一般是 '/dev/ttyx' 的格式,例如:'dev/ttyUSB0'。 reader, writer = await serial_asyncio.open_serial_connection(url='/dev/cu.usbserial-1140', baudrate=9600) # 生成串口讀寫異步任務(wù)各一個 task_1 = asyncio.create_task(read_from_serial(reader)) task_2 = asyncio.create_task(write_to_serial(writer)) # 并行運行兩個異步任務(wù) await task_1 await task_2 if __name__ == '__main__': asyncio.run(main())
這個程序可以分為三個部分
1. 讀寫異步函數(shù):read_from_serial 和 send_to_serial。其中后者每隔兩秒鐘向串口發(fā)送b“hello”字節(jié)串;前者則從串口接收數(shù)據(jù),并將接收的時間的操作的序號打印出來。
2. 初始化異步函數(shù)main(),這個函數(shù)的功能是打開串口、生成接收和發(fā)送任務(wù),并行執(zhí)行這兩個任務(wù),以進行串口的收發(fā)。
3. 最后的__name__ == ‘__main__’: 的主程序部分啟動程序的運行。
這個程序的測試運行過程
如下:
1. 準(zhǔn)備一個 USB 轉(zhuǎn)串口的轉(zhuǎn)接板;
2. 將轉(zhuǎn)接板的 TxD 和 RxD 短接,使發(fā)送的數(shù)據(jù)直接送到接收端;
3. 在操作系統(tǒng)上查找插入的串口設(shè)備,在 windows 操作系統(tǒng)下,可以用設(shè)備管理器查找;MacOS 下可以在終端上用 ls /dev/cu.* 命令查找;Linux 下則可以用 ls /dev/ttyUSB* 查找。當(dāng)然,也可以用pyserial 模塊中的相關(guān)功能編程查找。
4. 根據(jù)查找的結(jié)果改寫異步 main 程序中的 uri 參數(shù),上面程序是MacOS下的例子。
5. 啟動程序,查看運行結(jié)果(見下)。
/usr/local/bin/python3 /Users/xxxxxx/PycharmProjects/try_and_test/async_serial_3.py received at 11:23:25, hello, serial = 0 received at 11:23:27, hello, serial = 1 received at 11:23:29, hello, serial = 2 received at 11:23:31, hello, serial = 3 received at 11:23:33, hello, serial = 4 received at 11:23:35, hello, serial = 5 received at 11:23:37, hello, serial = 6
在上述程序的基礎(chǔ)上,加上異常處理、內(nèi)部隊列接口等就可以實現(xiàn)自己所需功能的實用串口接口程序了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pyspark讀取parquet數(shù)據(jù)過程解析
這篇文章主要介紹了pyspark讀取parquet數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03Python函數(shù)參數(shù)匹配模型通用規(guī)則keyword-only參數(shù)詳解
Python3對函數(shù)參數(shù)的排序規(guī)則更加通用化了,即Python3 keyword-only參數(shù),該參數(shù)即為必須只按照關(guān)鍵字傳遞而不會有一個位置參數(shù)來填充的參數(shù)。這篇文章主要介紹了Python函數(shù)參數(shù)匹配模型通用規(guī)則keyword-only參數(shù),需要的朋友可以參考下2019-06-06Python3 + Appium + 安卓模擬器實現(xiàn)APP自動化測試并生成測試報告
這篇文章主要介紹了Python3 + Appium + 安卓模擬器實現(xiàn)APP自動化測試并生成測試報告,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Python計算三角函數(shù)之a(chǎn)sin()方法的使用
這篇文章主要介紹了Python計算三角函數(shù)之a(chǎn)sin()方法的使用,是Python入門的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05基于Python __dict__與dir()的區(qū)別詳解
下面小編就為大家?guī)硪黄赑ython __dict__與dir()的區(qū)別詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10