Python之串口收发的异步程序

 更新时间:2023年09月06日 10:24:03   作者:土谷祠房客  
这篇文章主要介绍了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

在上述程序的基础上,加上异常处理、内部队列接口等就可以实现自己所需功能的实用串口接口程序了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Pyspark读取parquet数据过程解析

    Pyspark读取parquet数据过程解析

    这篇文章主要介绍了pyspark读取parquet数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python函数参数匹配模型通用规则keyword-only参数详解

    Python函数参数匹配模型通用规则keyword-only参数详解

    Python3对函数参数的排序规则更加通用化了,即Python3 keyword-only参数,该参数即为必须只按照关键字传递而不会有一个位置参数来填充的参数。这篇文章主要介绍了Python函数参数匹配模型通用规则keyword-only参数,需要的朋友可以参考下
    2019-06-06
  • python中pandas常用命令详解

    python中pandas常用命令详解

    pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,这篇文章主要介绍了python中pandas常用命令,需要的朋友可以参考下
    2022-07-07
  • Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告

    Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告

    这篇文章主要介绍了Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • python获取程序执行文件路径的方法(推荐)

    python获取程序执行文件路径的方法(推荐)

    下面小编就为大家分享一篇python获取程序执行文件路径的方法(推荐),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python计算三角函数之asin()方法的使用

    Python计算三角函数之asin()方法的使用

    这篇文章主要介绍了Python计算三角函数之asin()方法的使用,是Python入门的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python绘制极坐标基向量详解

    Python绘制极坐标基向量详解

    这篇文章主要介绍了如何利用python绘制极坐标的基向量,文中的示例代码讲解详细,具有一定的的参考价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • 基于Python __dict__与dir()的区别详解

    基于Python __dict__与dir()的区别详解

    下面小编就为大家带来一篇基于Python __dict__与dir()的区别详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Python一些基本的图像操作和处理总结

    Python一些基本的图像操作和处理总结

    今天给大家带来的是关于Python的相关知识,文章围绕着Python图像操作和处理展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • django-初始配置(纯手写)详解

    django-初始配置(纯手写)详解

    这篇文章主要介绍了django-初始配置(纯手写)详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论