【串口通信】python serial库时read、readline、read_all等方法的区别_python serial read-程序员宅基地

技术标签: python  PyQt5开发实战  单片机  开发语言  

  • 作者简介:大家好,我是Zeeland,全栈领域优质创作者。
  • CSDN主页:Zeeland
  • 我的博客:Zeeland
  • Github主页: Undertone0809 (Zeeland) (github.com)
  • 支持我:点赞+收藏️+留言
  • 介绍:The mixture of software dev+Iot+ml+anything

1. 概况

Python中Serial在读取数据的时候具有几种方法,本文将简单介绍一下如何使用serial库解析串口的数据。

2. 介绍

本文需要用到的几种方法和属性,大概看看就好,主要看下面的教程如何使用。

方法 功能
serial.read(size) 读取size字节的数据
serial.readline() 读取一行的数据
serial.readlines() 读取多行的数据,将数据保存到数组里
serial.read_all() 读取一个timeout周期内的全部数据(常用方法)
serial.read_all 读取串口所有的参数信息
serial_timeout(参数) 超时属性,下面具体介绍

3. 快速上手

  • 下面的场景我们需要用用COM4串口发送一串字符串"hello world",波特率9600,如何使用python的serial库进行解析串口发送来的数据?

  • 直接上代码

import serial

ser = serial.Serial("COM2", 9600, timeout=0.01)

while True:
    data = ser.read_all()
    if data:
        rec_str = data.decode('utf-8')
        print(rec_str)
        
  • 这里我创建了两个虚拟的串口进行模拟,COM2向COM1发送了两次hello world,而Python端实现了COM1,监听来自COM2的消息,用read_all()方法读取接收到的数据,接收到的数据类型是bytes类型的,因此我们需要将bytes数组转成字符串print出来,如下图所示。

在这里插入图片描述

  • 而初始化的时候这里的timeout是指在设定的timeout时间范围内,如果读取的字节数据是有效的(就是非空)那就直接返回,否则一直会等到这个设定的timeout时间并返回这段时间所读的全部字节数据。

  • 简单来说你可以理解为每timeout秒读一次数据,而如果timeout太小,数据量太大,可能一次发送不完,会数据未读完的状态。

  • 也就是说,如果我的timeout设置为0.01,现在我有一个串口通信的传感器,传感器通过串口使用COM2发送一次数据,传感器如果在0.01秒内将所有数据都传输过来,就保存到缓存buffer中,到了0.01秒后会调用一次read_all()就可以读取到传感器发送到buffer中的数据了;如果传感器在0.01秒内没有将数据发送全的话,buffer中的数据就是不完全的,就会返回不完全的数据;如果传感器在0.01秒内发送了数据的话,buffer也会返回两组合在一起的数据。

注意:timeout的设置至关重要,如果不是特别高频的数据的话,timeout=0.01的100Hz完全够了,当然timeout最小支持多少要看你的波特率。如果我0.3秒发送了一次数据,timeout设置0.01,就可以返回一次完整的数据;如果我0.01秒发送一次数据,timeout设置0.3,那么一次就会返回30次数据,所以这就是timeout的作用。

  • 前面引入了buffer的概念,这里你应该可以知道,你可以直接把buffer理解为一个文件夹,读数据的方式是和file是一样的,只是引入的timeout的概念,使得buffer 内的数据会以 1/timeout 的频率进行刷新。
  • 如果你把buffer当做file理解,那么readline()就是读取buffer中的一行,如果你的数据中存在\n这样的换行,那么用readline()先让不合适,很容易产生漏读的问题,而且如果你在一个timeout周期内没有用readline()处理完所有你想要的数据的话,buffer就刷新了,因此通过笔者的实践和项目经历读数据只推荐用read_all()来读取。

4. 更好的解决方案——cushy-serial

cushy-serial是一个轻量级的Serial框架,初衷是希望使Serial编程变得更加简单、快捷,因此,相较于传统的pyserial,该框架可以更加快速地构建起一个serial程序,其可以兼容pyserial的所有特性,并且自定义serial消息异步回调,无需花费精力在多线程上,项目地址:https://github.com/Undertone0809/cushy-serial

主要特性

  • 兼容pyserial的所有特性
  • 自定义serial消息异步回调,无需花费精力在多线程上
  • 提供串口定时任务
  • 方便实现和管理多个serial连接
  • 可自定义消息协议,兼容性强

快速上手

pip install cushy-serial --upgrade 
  • 下面是一个简单的serial程序,当python客户端接收到来自串口的信息时会自动回调
from cushy_serial import CushySerial  
  
serial = CushySerial("COM1", 9600)  
serial.send("I am python client")  
  
  
@serial.on_message()  
def handle_serial_message(msg: bytes):  
    str_msg = msg.decode("utf-8")    
    print(f"[serial] rec msg: {
      str_msg}")  
  

需要说明的是,CushySerial兼容了Serial中所有的功能,因此,你可以在CushySerial中使用Serial的所有功能。

  • 运行结果如下
  • 如果你想要执行定时任务,CushySerial也提供了相关的解决方案,你可以方便的轮询发送指令,并获取来自串口的信息,示例如下:
from cushy_serial import CushySerial, enable_log

enable_log()
serial = CushySerial("COM1", 9600)
instruction = bytes([0x01, 0x06, 0x00, 0x7F, 0x00, 0x01, 0x79, 0xD2])

# msg为你要轮询发送的指令,interval为轮询的时间间隔,times为执行次数,可不填写
@serial.polling_task(msg=instruction, interval=0.5, times=5)
def handle_rec_msg(rec_msg):
    print(f"[serial] rec polling message: {
      rec_msg}")

5. 总结

  • 在平时串口通信中,最好使用read_all()方法,并选定合适的timeout。
  • timeout的参考资料:相关链接
  • 要是懒一点就直接用cushy-serial

猜你想看:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/linZinan_/article/details/114804811

智能推荐

前端实现打印预览功能以及page-break-inside属性解决打印换行问题(打印预览表格或文字被分割开)-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏26次。遇到的问题:打印预览的时候表格被分割了,就是一共两页而其中一行显示在不同的两个页面。如下图:_page-break-inside

稀疏矩阵在matalb中_spconvert函数-程序员宅基地

文章浏览阅读298次。1.存储2.转化为稀疏矩阵 sparse函数和full函数3.直接建立稀疏矩阵 spconvert函数4.带状稀疏矩阵spdiags函数例题:求解三对角线方程组的解_spconvert函数

iOS 开发 关闭黑暗模式_ios开发 关闭对黑暗模式的支持-程序员宅基地

文章浏览阅读1.9k次。在info.plist文件中加一条Appearance - Light, 如下图:参考博客:iOS暗黑(dark)模式适配IOS 开发之关闭暗黑模式_ios开发 关闭对黑暗模式的支持

【iOS开发】SwiftLint——代码规范工具-程序员宅基地

文章浏览阅读1.1k次。目的包括PMS及以后的Swift项目在多人开发中,即使有官网的规范模板,每个人的代码风格和规范难以做到完全一致,对后期项目维护会增加一定的困难。使用SwiftLint可以对规范代码有很大帮助。SwiftLint是啥SwiftLint是Realm公司开发的一个插件,专门用于管理Swift代码的规范,能够对原有的代码自动格式化,在 Xcode 中执行编译时,SwiftLint 会自动运行检查,不符合规范的代码会通过警告或者报错的形式指示出来,并且拥有丰富的配置项,可以进行大量的自定义规范操作,是一个很方_swiftlint

tomcat 源码阅读步骤一_myeclipse怎么查看tomcat源码-程序员宅基地

文章浏览阅读618次。tomcat源码阅读1org.apache.catalina 包包内接口主要有:AuthenticatorAuthenticator 是一个组件(通常是一个阀门或容器),它提供了这类服务的身份验证Cluster一个Cluster 像一个当地客户服务器集群那样工作,它的实现需要支持集群内的多种交流方式Contained它是一个解耦接_myeclipse怎么查看tomcat源码

[Android]APP多域名服务高可用方案_一个app要连多个域名灾备吗-程序员宅基地

文章浏览阅读2.6k次。负责公司的基础数据扫描采集.这部分对于系统的可用性基本是100%所以做了很多高可用的方案前置准备在对APP进行高可用实施之前,我们需要准备:1.核心域名多个降级[一主多备]最基础的要求,必须!!!能够支持云端下发 & 本地动态切换(蓝-绿发布 & 灰度 & UAT)2.多个CDN每个域名 都使用不同CDN,避免因CDN节点故障导致服务不可用(出现过因CDN节点异常的生产故障)3.多个部署网络机房每个域名 部署在不同地域网络机房(出现过主干线因施工被挖断的生产._一个app要连多个域名灾备吗

随便推点

fmea手册_新版FMEA打分怎么破?(详细收录手册标准对照表...-程序员宅基地

文章浏览阅读5.6k次。新版FMEA终于正式发布了!关于新版FMEA正式版与草稿版的差异,后续黄老师将会每周撰写新文来给大家做解读及分享,敬请持续关注公众号(首页菜单的历史文章中有FMEA合集,大家可随时点击阅读旧文)。为了方便部分已经懂了七步法的学员可以直接进行新版FMEA的使用,本篇特别将新版FMEA手册中的评分表整理出来,方便参考使用。本篇文章建议收藏,后续可持续做为工具书随时参考使用。关于打分说起FMEA,打分是..._fmea打分标准对照表

Fantastical 2 for Mac(日历管理软件) v2.5免激活版-程序员宅基地

文章浏览阅读3.3k次。今天小编为您带来Fantastical 2 Mac一款易于使用的日历管理软件,Fantastical 2 Mac版采用了全新的设计风格,和Yosemite系统十分贴合,并且提供了「光」和“黑暗”两种配色模式,可以切换左栏的颜色。右侧的布局和系统原生日历十分相像,而在左侧则显示了该月日期及行程安排,并且还整合了系统原生的 「提醒事项」 。Fantastical 2Mac破解版使用说明下载完成...

微信小程序|自定义弹窗组件_微信小程序的自定义弹窗-程序员宅基地

文章浏览阅读1.3w次,点赞63次,收藏66次。深入探讨如何创建自定义弹出组件,穿插案例研究和实际应用,在实际开发中更好地利用自定义弹出组件来提升用户体验。_微信小程序的自定义弹窗

Teechart for .net 使用总结_使用teechart.dll会不会弹出收费-程序员宅基地

文章浏览阅读6.1k次。先说一下:Teechart for .net v3.0 破解版 下载地址:http://download.csdn.net/source/1565607先来张示例图:最近公司开发web图标,采用了Teechart 控件。挺好用的。 因为以前公司用这个控件写c/s程序(主要是Delphi的)很好用,所以也推荐我用这个的.net版本。经过几天的研究,用这还可以,功能很强大。总结te_使用teechart.dll会不会弹出收费

bochs_error: flat file is not writable-程序员宅基地

文章浏览阅读144次。一般这种不可写入都是权限问题,一看工作目录才发现自己在。目录下,不由得大吃一惊,赶紧使用命令。Windows的wsl环境下,使用。创建软盘时,结尾有报错。,然后就恢复正常了。_error: flat file is not writable

亚马逊 开发者api 调用_Amazon各个Api对接地址-程序员宅基地

文章浏览阅读3.9k次。亚马逊平台对接地址由于最近几年都在做甲骨文的netsuite的相关的开发,尤其对跨境电商的开发对接整理了一份关于amazom的对接相关地址,具体的api接口调整地址以amazom官方的开发者为准,以下仅供参考主要API地址http://docs.developer.amazonservices.com/zh_CN/orders/2013-09-01/Orders_ListOrders.html接口..._亚马逊all settlement api地址

推荐文章

热门文章

相关标签