Python之串口收发的异步程序
作者:土谷祠房客
Python串口收发的异步程序
进行Python串口程序开发时,一般使用 pyserial 模块。这是个同步方式运行的库。
串口运行时,收发等待的时间较多,使用异步方式开发可以提高开发效率和运行效率。
为了进行异步编程,可以使用一个建立在 asyncio 基础上的异步串口程序模块,即pyserial_asyncio 模块。
在使用这个模块时,我们发现,网上资料中,能够独立直接运行的简单实例较少。
为此,我们编写了一个简单的可以独立运行的实例,以方便读者使用这个模块。
下面是这个程序的完整代码
可以在 python 3.9 及以后的版本上运行。
注意:
编程和运行前要安装 pyserial_asyncio 模块。
import asyncio import serial_asyncio import time # 接收异步函数,收到后打印时间、收到的内容和接收的序号 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 # 发送异步函数,每隔两秒钟发送一次 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) # 生成串口读写异步任务各一个 task_1 = asyncio.create_task(read_from_serial(reader)) task_2 = asyncio.create_task(write_to_serial(writer)) # 并行运行两个异步任务 await task_1 await task_2 if __name__ == '__main__': asyncio.run(main())
这个程序可以分为三个部分
1. 读写异步函数:read_from_serial 和 send_to_serial。其中后者每隔两秒钟向串口发送b“hello”字节串;前者则从串口接收数据,并将接收的时间的操作的序号打印出来。
2. 初始化异步函数main(),这个函数的功能是打开串口、生成接收和发送任务,并行执行这两个任务,以进行串口的收发。
3. 最后的__name__ == ‘__main__’: 的主程序部分启动程序的运行。
这个程序的测试运行过程
如下:
1. 准备一个 USB 转串口的转接板;
2. 将转接板的 TxD 和 RxD 短接,使发送的数据直接送到接收端;
3. 在操作系统上查找插入的串口设备,在 windows 操作系统下,可以用设备管理器查找;MacOS 下可以在终端上用 ls /dev/cu.* 命令查找;Linux 下则可以用 ls /dev/ttyUSB* 查找。当然,也可以用pyserial 模块中的相关功能编程查找。
4. 根据查找的结果改写异步 main 程序中的 uri 参数,上面程序是MacOS下的例子。
5. 启动程序,查看运行结果(见下)。
/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
在上述程序的基础上,加上异常处理、内部队列接口等就可以实现自己所需功能的实用串口接口程序了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。