【python】导入serial模块,读写串口数据(嵌入式软件自动化测试)

目录

  • 环境准备
    • 安装pyserial
    • 硬件连接
  • 基本函数使用
    • 获取串口设备列表
    • 初始化串口对象
    • 发送数据
    • 读取数据

环境准备

安装pyserial

1、python 3.6.7
2、pyserial模块封装了python对串口的访问

pip install serialpip install pyserial

如果代码报错卸载掉serial

硬件连接

1、将串口设备连接电脑
2、右击我的电脑-管理-设备管理器-端口,查看端口号
在这里插入图片描述
这里COM5是串口号,使用CH340串口芯片来进行的通信。

基本函数使用

list(serial.tools.list_ports.comports()) #获取串口设备列表
ser=serial.Serial() #初始化串口对象
ser.open() #打开串口
ser.close() #关闭串口ser.write() #发送数据
ser.read() #从端口读字节数据,默认1个字节
ser.read_all() #从端口读全部数据
ser.readline() #读一行数据
ser.readlines() #读多行数据ser.isOpen() #查看端口是否被打开
ser.flush() #等待所有数据写出
ser.flushInput() #丢弃接收缓存中的所有数据
ser.flushOutput() #终止当前写操作,并丢弃发送缓存中的数据
ser.reset_input_buffer() #清空串口的接收缓冲区
ser.reset_output_buffer() #清空串口的发送缓冲区

获取串口设备列表

1)使用list(serial.tools.list_ports.comports())获取串口设备列表。
2)代码实例:

import serial
import time
import serial.tools.list_portsif __name__ == '__main__':# 获取所有可用串口ports_list = list(serial.tools.list_ports.comports())if len(ports_list) <= 0:print("无串口设备。")else:print("可用的串口设备如下:")for comport in ports_list:print(list(comport)[0], list(comport)[1])

运行后:
在这里插入图片描述

初始化串口对象

1)串口初始化的函数serial.Serial()

    ser = serial.Serial('COM5', 115200, timeout=15)  ##连接串口,打开

函数内的三个参数的作用:

参数1:com5为串口的端口号

参数2:115200为串口的波特率

参数3:timeout为串口的超时设置

以上三个参数作为常用的参数,这边主要说一下,其他的参数用的比较少。

说明:
当我们初始化串口的时候,ser.open()函数会被调用,串口就会被打开。
timeout参数会影响到ser.read()函数的使用,这个timeout参数非常重要,直接影响到我们对串口数据的读取。

timeout = None: 一直等待,直到设置的接收字节数满后退出
timeout = 0: 非阻塞模式,在任何情况下都立即返回,返回零或更多,最多为请求的字节数
timeout = x:当请求的字节数可用时,将timeout设置为x秒(允许浮动)立即返回,否则等待超时到期,并返回在此之前收到的所有字节。

2)其他参数

port – 串口名字(COMn或者/dev/ttyUSB)或者None
baudrate (int) – 波特率,比如9600或者115200
bytesize – 数据位数,可能的参数值有: FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS
parity – 奇偶校验,参数值: PARITY_NONE, PARITY_EVEN, PARITY_ODD ,PARITY_MARK, PARITY_SPACE
stopbits – 停止位的比特数. 可能的参数值: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
timeout (float) – 设置pyserial持续读取数据的最长时间(s)
xonxoff (bool) – 是否启动软件流控制
rtscts (bool) – 是否启动硬件(RTS/CTS)流控制
dsrdtr (bool) – 是否启动硬件(DSR/DTR)流控制
write_timeout (float) – 设置pyserial最长写入串口数据的时间(s)
inter_byte_timeout (float) – 字符间超时, 没有则禁止(默认禁止).
exclusive (bool) – 设置独占访问模式(仅POSIX)。 如果端口已经以独占访问模式打开,则不能以独占访问模式打开端口。

3)代码实例:

import serialif __name__ == '__main__':ser = serial.Serial('COM5', 115200, timeout=15)  ##连接串口,同时调用了ser.opem()打开串口ser_status=ser.is_openprint('当前串口状态:'+str(ser_status))ser.close()ser_status = ser.is_openprint('当前串口状态:' + str(ser_status))

运行后:
在这里插入图片描述
或者代码参数提取出来:

import serialser = serial.Serial()
def port_open_recv():  # 对串口的参数进行配置ser.port = 'COM5' #串口号ser.baudrate = 115200 #波特率ser.bytesize = 8  #数据位数ser.stopbits = 1 #停止位的比特数ser.parity = "N"  # 奇偶校验位ser.timeout=15  #超时ser.open()if (ser.isOpen()):print("串口打开成功!")else:print("串口打开失败!")if __name__ == '__main__':port_open_recv()

代码运行后:
在这里插入图片描述

发送数据

在嵌入式中,我们使用发包,一般是将我们的状态数据,或者是控制指令通过转码为符合设备的通信协议的格式后,将其发出。
因此,我们在编写发包函数前,需要先熟读通信协议,并理解我们需要发送什么样的指令,一般协议是16进制的一串数据。
pyserial中发包函数为write()
1)方式一:

write(b'abcdef\n')

b:此参数表示bytes类型, 直接发送字符串会报错
\n:换行的意思
abcdef:要发送的内容
注意:必须要在前面加入b,表示以bytes形式像串口写入数据

实例代码:

import serialif __name__ == '__main__':ser = serial.Serial('COM1', 115200, timeout=15)  ##连接串口,打开ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口,打开ser.write(b'Hello\n')  #方式一发送数据Read = ser2.read_all()  #读取所有数据print(Read)ser.close()  ###关闭串口连接

运行后:
在这里插入图片描述
2)方式二:

write('ff'.encode('utf-8'))

必须对Unicode字符串进行编码,例如“hello”.encode(“utf-8”)

实例代码:

import serialif __name__ == '__main__':ser = serial.Serial('COM1', 115200, timeout=15)  ##连接串口,打开ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口,打开ser.write('ff'.encode('utf-8'))#方式二发送数据Read = ser2.read_all()  #读取所有数据print(Read)ser.close()  ###关闭串口连接

运行后:
在这里插入图片描述

读取数据

串口的读数据操作这边就统一来介绍了,分别为:

(1)ser.read() :从端口读字节数据,默认1个字节

(2)ser.read_all() :读全部数据

(3)ser.readline() :读一行数据

(4)ser.readlines() :读多行数据

1)示例代码1(读取指定字节数):

import serialif __name__ == '__main__':ser = serial.Serial('COM1', 115200, timeout=15)  ##连接串口,打开ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口,打开Write = ser.write(b'Hello\n')  ##发送数据Read = ser2.read(3)  ###接收3个字节数据print(Read)ser.close()  ###关闭串口连接

运行后:
在这里插入图片描述

2)示例代码2(读全部数据):

import serialif __name__ == '__main__':ser = serial.Serial('COM1', 115200, timeout=15)  ##连接串口,打开ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口,打开ser.write(b'Hello\n')  #方式一发送数据ser.write(b'World\n')  # 方式一发送数据Read = ser2.read_all()  #读取所有数据print(Read)ser.close()  ###关闭串口连接

运行后:
在这里插入图片描述
3)示例代码3(读一行数据):

import serialif __name__ == '__main__':ser = serial.Serial('COM1', 115200, timeout=15)  ##连接串口,打开ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口,打开ser.write(b'Hello\n')  #方式一发送数据ser.write(b'World\n')  # 方式一发送数据Read = ser2.readline()   #读取一行数据print(Read)ser.close()  ###关闭串口连接

运行后:
在这里插入图片描述
4)示例代码4(读多行数据):

import serialif __name__ == '__main__':ser = serial.Serial('COM1', 115200, timeout=15)  ##连接串口,打开ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口,打开ser.write(b'Hello\n')  #方式一发送数据ser.write(b'World\n')  # 方式一发送数据Read = ser2.readlines()   #读取多行数据print(Read)ser.close()  ###关闭串口连接

运行后:
在这里插入图片描述

常见问题:
1、读取回的是b’ '。排查方式:使用串口调式工具发送数据后,能不能收到数据
比如我使用串口调试工具发送数据后,没有收到数据,那么代码运行后也不会读到数据
在这里插入图片描述
在这里插入图片描述

2、连接的设备TXD和RXD相连,使用串口调试工具测试,能同时看到收发的数据,那么代码运行后也会读到数据
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

获取可以使用两个串口,一个发送一个接收。使用虚拟串口工具,发送串口写入,接收串口读取。

    ser1 = serial.Serial('COM1', 115200, timeout=15)  ##连接串口1ser2 = serial.Serial('COM2', 115200, timeout=15)  ##连接串口2Write = ser1.write(b'Hello\n')  ##串口1发送数据Read = ser2.readlines()  #串口2读多行数据

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1483915.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Android 10.0 SystemUI下拉状态栏固定展开QsPanel不收缩功能实现

1. 前言 在10.0的系统ROM产品定制化开发中,在systemUi的原生下拉状态栏中,首次下拉展开quickQsPanel,第二次展开就显示 QsPanel,在产品开发中,需要下拉状态栏固定展开QsPanel,不需要二次展开,接下来分析下相关功能的实现,如图: 2.SystemUI下拉状态栏固定展开QsPanel不收…

Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型

&#x1f3af;要点 &#x1f3af;双图神经网络模型&#xff1a;最大后验推理和线性纠错码解码器 | &#x1f3af;重复结构和过约束问题超图推理模型 | &#x1f3af;无向图模型变量概率计算、和积消息传播图结构计算、隐马尔可夫模型图结构计算、矩阵图结构计算、图结构学习 |…

基于Java技术的致远汽车租赁系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;B/S模式、Java技术 工具&#xff1a;Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册…

现场可重构CPLD芯片应用案例—蓝牙音箱

我司英尚微提供的高性能数模混合现场可重构IC、通用可配置的模数混合芯片内部集成丰富的模拟资源和数字资源&#xff0c;可轻松替代电路中的各种标准器件&#xff0c;并按照客户要求组合成最优小型ASIC&#xff0c;缩短开发周期&#xff0c;降低成本。下面介绍LS98002现场可重构…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

链表面试练习习题(Java)

1. 思路&#xff1a; 创建两个链表&#xff0c;一个用来记录小于x的结点&#xff0c;一个用来记录大于等于x的结点&#xff0c;然后遍历完原链表后&#xff0c;将小于x的链表和大于等于x的链表进行拼接即可 public class Partition { public ListNode partition(ListNode pH…

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件&#xff0c;但是&#xff0c;当我们想要对其进行编辑的时候&#xff0c;PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗&#xff1f;如何将PDF转换成可以直接编辑的CAD图纸呢&#xff1f;本篇给你答案。 1、启动迅捷CAD编辑器&…

linux进行redis的安装并使用RDB进行数据迁移

现在有两台电脑&#xff0c;分别是A&#xff0c;B&#xff0c;现在我要把A电脑上的redis的数据迁移到B电脑上&#xff0c;B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis&#xff0c;一般来说&#xff0c;都是直接在linux的控制台输入&#xff1a;re…

Spring Cloud Loadbalancer 的使用

一、默认负载均衡策略 Spring Cloud LoadBalancer 默认的负载均衡策略是轮询。 轮询效果示例 我们需要示例一个请求分发到不同的模块上&#xff0c;所以我们需要创建多模块项目。 新建 Spring Boot &#xff08;3.0.2&#xff09;的 Maven 项目&#xff08;JDK 17&#xff09…

万界星空科技MES系统生产计划管理的功能

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;的生产计划管理功能是其核心功能之一&#xff0c;旨在将企业的生产计划转化为实际的生产操作&#xff0c;并通过实时监控和调整来确保生产活动的顺利进行。以下是MES系统生产计划管理功…

STM32智能环境监测系统教程

目录 引言环境准备智能环境监测系统基础代码实现&#xff1a;实现智能环境监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;环境监测与管理问题解决方案与优化收尾与总结 1. 引言 智能环境监测系统通…

基于STM32智能电子锁设计

1.简介 随着时代的高速发展&#xff0c;家居安全也成为人们日常生活中的一个安全问题。目前传统的门锁使用的是机械密码&#xff0c;在安全性方面表现不佳。这些缺点可以通过改用智能电子密码锁来弥补。智能电子锁是一种使用了现代电子技术的高科技产品&#xff0c;它的出现解决…

ActiveMQ配置延迟投递和定时投递教程

配置activemq.xml中的<broker>标签添加schedulerSupport"true" schedulerSupport"true"更改完成重启生效 四大属性解释 Property nametypedescriptionAMQ_SCHEDULED_DELAYlong延迟投递的时间AMQ_SCHEDULED_PERIODlong重复投递的时间间隔AMQ_SCHEDU…

期权末日双买跨式策略-这才是末日轮稳定赚钱的方法吗?!

今天带你了解期权末日双买跨式策略-这才是末日轮稳定赚钱的方法吗&#xff1f;&#xff01;期权末日双买跨式策略是一种在期权到期日前预期市场会出现大幅波动时使用的策略。 期权双买跨式策略适合期权末日轮是因为它能利用临近到期日时市场潜在的大幅波动来获利。末日轮期权&…

AI数字人+数字孪生IOC智慧运营平台:提升业务场景智慧化运维水平

在人工智能时代&#xff0c;“AI数字人数字孪生IOC智慧运营平台”&#xff0c;不仅能够提升数字孪生系统的人机交互体验&#xff0c;还能实现高效的运维管理&#xff0c;可以有效推动多领域场景数字化转型和智能化升级。 案例分享 深圳新一代产业园NEXT PARK交流中心 深圳新一…

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程① | 5.1 - 5.3

前言 第5章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.1 软件工程定义 5.2 软件需求 5.2.1 需求的层次 5.2.2 质量功能部署 5.2.3 需求获取 5.2.4 需求分析 5.2.5 需求规格说明书 5.2.6 需求变…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明&#xff1a;这是自己做的课程设计作业&#xff0c;得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线&#xff0c;分别是存储用户信息和商品信息&#xff0c;并且都设为公共属性&#xff0c;方便对用户信息和商品信息…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

【面试题】Golang 自动垃圾回收机制细节(第六篇)

目录 Go V1.3之前的标记清除&#xff08;mark and sweep&#xff09; Go V1.5三色标记法 Go V1.8混合写屏障机制 各版本之间的区别 Go V1.3之前的标记清除&#xff08;mark and sweep&#xff09; 流程 1.暂停程序业务逻辑&#xff0c;找出不可达的对象和可达对象 2.开始…

WebPlotDigitizer图像取点软件/在线网页

记录一下WebPlotDigitizer的使用方法。 网上一搜就能搜到官网&#xff0c;本文也把网址放在最后了。 1 上传待处理图像 2 选择图像的类型 每个选项都有示例图&#xff0c;不一一解释了。选好后点击 calibrate 3 确定横纵坐标 3.1 上一步完成后&#xff0c;左边栏会自动跳…