Python 串口通信
Python 串口通信
1.先安装serial库
pip install serial
此时报错,是因为我们库安装错了,吧serial库先卸载
pip uninstall serial
安装正确的库
pip install pyserial
ok,在试试吧
打开串口的方式
首先先看端口是多少
Windows上串口名称一般类似COM1,Linux上串口名称一般类似/dev/ttyUSB1
打开方式1,默认参数打开串口
import serial s = serial.Serial('COM1', baudrate=115200, timeout=0.8) print(s.is_open)
打开方式2,手动配置串口打开
# 第二种手动配置后在打开串口
s = serial.Serial()
s.port = 'COM1'
s.baudrate = 115200
s.timeout = 0.8
print(s.is_open)
s.open()
print(s.is_open)
import serial s = serial.Serial() s.port = 'COM1' s.baudrate = 115200 s.timeout = 0.8 print(f"串口打开状态: {s.is_open}") print(f"串口DTR: {s.dtr}") print(f"串口RTS: {s.rts}") s.open() s.dtr = False # 设置DTR s.rts = False # 设置RTS print(f"串口打开状态: {s.is_open}") print(f"串口DTR: {s.dtr}") # 数据终端准备(DTR) print(f"串口RTS: {s.rts}") # 请求发送(RTS)
串口的写入
import serial # 普通AT指令的写入 # 打开串口 # s = serial.Serial(port='COM1', baudrate=115200, timeout=1) # # # 使用UTF-8编码,把AT命令转为字节 # at_command = "AT\r".encode('utf-8') # # # 串口写入 # num3 = s.write(at_command) # print(f'写入{num3}字节') # 控制字符的写入 s2 = serial.Serial(port='COM1', baudrate=115200, timeout=1) # 找到CTRL+Z对应的ASCII码 ctrl_z_ascii = 0x1A ctrl_z = chr(ctrl_z_ascii).encode('utf-8') nums = s2.write(ctrl_z) print(f"写入 {nums} 字节")
串口的读取
# import serial # # s = serial.serial_for_url('loop://', baudrate=115200, timeout=1) # loop:// 为serial内置库debug类型的串口 # 这里填串口名称COM1也是可以的
# # serial_for_url 可以接收网络形式的串口(socket形式)
# # s.write('0123456789'.encode('utf-8'))
# # data1=s.read(3) # 默认读取1字节
# print('data1:%s'%data1)
# print(data1.decode('utf-8')) #
# # data2 = s.readline()
# print(f'data2{data2}')
timeout 设置为0时
import serial s = serial.serial_for_url("loop://", baudrate=115200, timeout=0) # 写入0123456789共10字节,使用read方法读取 s.write("0123456789".encode("utf-8")) print("写入 0123456789") print(f"尝试读取一个字节: {s.read()}") print(f"尝试读取100个字节: {s.read(100)}") print(f"再尝试读取一个字节: {s.read()}") # 写入0123456789\n012345678901234,使用readline方法读取 s.write("0123456789\n01234567890123456789".encode("utf-8")) print(f"尝试读取一行: {s.readline()}") print(f"再尝试读取一行: {s.readline()}") print(f"再次尝试读取一行: {s.readline()}")
timeout 设置为5时
import serial s = serial.serial_for_url("loop://", baudrate=115200, timeout=5) # 写入0123456789共10字节,使用read方法读取 s.write("0123456789".encode("utf-8")) print("写入 0123456789") print(f"尝试读取一个字节: {s.read()}") print(f"尝试读取100个字节: {s.read(100)}") # 此时读不到100字节就会等待,直到超时在返回 print(f"再尝试读取一个字节: {s.read()}") # 写入0123456789\n012345678901234,使用readline方法读取 s.write("0123456789\n01234567890123456789".encode("utf-8")) print(f"尝试读取一行: {s.readline()}") print(f"再尝试读取一行: {s.readline()}") # 此时读不到\n就会等待,直到超时在返回 print(f"再次尝试读取一行: {s.readline()}")
timeout 设置为None时
import serial s = serial.serial_for_url("loop://", baudrate=115200, timeout=None) # 写入0123456789共10字节,使用read方法读取 s.write("0123456789".encode("utf-8")) print("写入 0123456789") print(f"尝试读取一个字节: {s.read()}") print(f"尝试读取100个字节: {s.read(100)}") # 此时读不到100字节就会等待,程序不会结束 print(f"再尝试读取一个字节: {s.read()}") # 写入0123456789\n012345678901234,使用readline方法读取 # s.write("0123456789\n01234567890123456789".encode("utf-8")) # print(f"尝试读取一行: {s.readline()}") # print(f"再尝试读取一行: {s.readline()}") # 此时读不到\n就会一直等待 # print(f"再次尝试读取一行: {s.readline()}") # 综上所述,我们大部分情况把timeout设置成0
幻想毫无价值,计划渺如尘埃,目标不可能达到。这一切的一切毫无意义——除非我们付诸行动。