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
幻想毫无价值,计划渺如尘埃,目标不可能达到。这一切的一切毫无意义——除非我们付诸行动。