首页 > Python资料 博客日记
【python】导入serial模块,读写串口数据(嵌入式软件自动化测试)
2024-09-14 02:00:05Python资料围观40次
环境准备
安装pyserial
1、python 3.6.7
2、pyserial模块封装了python对串口的访问
pip install serial
pip 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_ports
if __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 serial
if __name__ == '__main__':
ser = serial.Serial('COM5', 115200, timeout=15) ##连接串口,同时调用了ser.opem()打开串口
ser_status=ser.is_open
print('当前串口状态:'+str(ser_status))
ser.close()
ser_status = ser.is_open
print('当前串口状态:' + str(ser_status))
运行后:
或者代码参数提取出来:
import serial
ser = 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 serial
if __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 serial
if __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 serial
if __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 serial
if __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 serial
if __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 serial
if __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) ##连接串口1
ser2 = serial.Serial('COM2', 115200, timeout=15) ##连接串口2
Write = ser1.write(b'Hello\n') ##串口1发送数据
Read = ser2.readlines() #串口2读多行数据
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj