栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 通过 serial 模块实现简单的串口交互

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 通过 serial 模块实现简单的串口交互

python 通过 serial 模块实现简单的串口交互
    • 前言
    • 前期准备
    • 导入所需模块
    • 创建一个装饰器
    • 创建一个信息打印函数
    • 创建一个串口日志捕获函数
    • 创建一个串口输入函数
    • 主函数实现
    • 主函数调用
    • 完整代码实现
    • 运行代码,开始交互

前言

在使用 python 工作的过程中,有时候不可避免的需要与串口进行交互。比如,自动的向串口发送某些特定的指令。再比如,自动从串口返回值中获取某些有用的信息。
这里做个笔记,便于后续需要时作参考。

前期准备

安装好 serial 模块:

pip install pyserial
导入所需模块
import serial
import threading
from functools import wraps
from datetime import datetime
创建一个装饰器

这个装饰器的作用是给捕获或者外发的数据信息添加一个时间戳

def timestamp_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
    	# 时间戳的输出格式为:[2022-06-12 13:52:43.806]  
        print(f'[{str(datetime.now())[:-3]}]  ', end='')
        func(*args, **kwargs)

    return wrapper
创建一个信息打印函数

此函数的作用是将用户的输入或者串口捕获到的输出作打印。
同时,调用前面创建的装饰器,为当前的打印添加一个时间戳,以便于工作中 debug 某个时间段的串口日志信息

@timestamp_decorator
def print_line(line, input_type='接收'):
	# [2022-06-12 14:06:00.491]  [接收] 这个一个串口信息
    print(f'[{input_type}] {line}')
创建一个串口日志捕获函数

此函数的作用是实时捕获来自串口的日志信息,同时将其打印

def catch_output(com):
    while True:
    	# 从串口中读取每一行日志信息
        line = com.readline().decode('GBK').strip()
        # line = com.readline().decode('GB2312').strip()
        print_line(line)
创建一个串口输入函数

此函数的作用是与串口的另一方作交互,给对方下发预期参数数据

def send_out_cmd(com):
    while True:
    	# >>> 给串口下发一个指令参数
		# [2022-06-12 14:13:23.786]  [发送] 给串口下发一个指令参数
        line = input('>>> ').strip()
        com.write(line.encode('GBK'))
        # com.write(line.encode('GB2312'))
        print_line(line, '发送')
主函数实现

封装一个主函数。此函数主要借用多线程 threading 实现串口的输出捕获和输入。

def main():
    com = serial.Serial(port='COM7', baudrate=115200)
    co = threading.Thread(target=catch_output, args=(com,))
    so = threading.Thread(target=send_out_cmd, args=(com,))
    co.start()
    so.start()
    co.join()
    so.join()
    print('terminate...')
主函数调用
if __name__ == '__main__':
    main()
完整代码实现
import serial
import threading
from functools import wraps
from datetime import datetime


def timestamp_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f'[{str(datetime.now())[:-3]}]  ', end='')
        func(*args, **kwargs)

    return wrapper


@timestamp_decorator
def print_line(line, input_type='接收'):
    print(f'[{input_type}] {line}')


def catch_output(com):
    while True:
        line = com.readline().decode('GBK').strip()
        # line = com.readline().decode('GB2312').strip()
        print_line(line)


def send_out_cmd(com):
    while True:
        line = input('>>> ').strip()
        com.write(line.encode('GBK'))
        # com.write(line.encode('GB2312'))
        print_line(line, '发送')


def main():
    com = serial.Serial(port='COM7', baudrate=115200)
    co = threading.Thread(target=catch_output, args=(com,))
    so = threading.Thread(target=send_out_cmd, args=(com,))
    co.start()
    so.start()
    co.join()
    so.join()
    print('terminate...')


if __name__ == '__main__':
    main()

运行代码,开始交互

参考:
https://blog.csdn.net/Electrical_IT/article/details/107201561

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号