python接入串口数据
第一步:安装所需的库
我们将使用 pyserial
库来处理串口通信。首先需要安装它:
- 打开终端或命令提示符。
- 执行以下命令安装 PySerial:
pip install pyserial
第二步:基本串口配置和连接
以下是一个基本的 Python 脚本示例,展示如何连接到一个串口设备并读取数据:
import serial
# 你的串口名称(例如 'COM3' 在 Windows 或 '/dev/ttyUSB0' 在 Linux/Mac)
port = 'COM3'
try:
# 打开串口
ser = serial.Serial(port,
baudrate=9600, # 波特率(请根据设备设置调整)
bytesize=serial.EIGHTBITS,
stopbits=serial.STOPBITS_ONE,
parity=serial.PARITY_NONE,
timeout=None) # 无超时(无限等待读取)
print(f"成功连接到 {port}")
except serial.SerialException:
print("无法打开串口,请检查串口名称和权限是否正确!")
第三步:读取数据
-
异步读取: Default 情况下,
timeout=None
配置意味着read()
方法会阻塞直到有数据可用。可以使用以下代码持续读取数据:while True: try: data = ser.readline() # 读取一行数据 if data: print("接收到的数据:", data.decode('utf-8')) # 将字节解码为字符串 except KeyboardInterrupt: # 按下 Ctrl+C 退出循环 break
-
定时读取: 如果你需要定期读取数据,可以设置一个超时时间:
ser.timeout = 1 # 设置超时为1秒 while True: try: data = ser.read(1024) # 读取最多1024个字节的数据 if len(data) > 0: print("接收到的数据:", data.decode('utf-8')) except KeyboardInterrupt: break except serial.SerialException as e: print("错误:", e) break
第四步:发送数据
如果需要向设备发送数据,可以使用以下代码:
# 发送字符串
command = "Hello, Serial Port!"
ser.write(command.encode('utf-8'))
print(f"已发送命令: {command}")
# 或者发 bytearray 格式的数据
data_to_send = bytearray([0x01, 0x02, 0x03])
ser.write(data_to_send)
第五步:处理接收到的数据
接收到的数据通常是 bytes
类型,你可以将其解码为字符串或者其他格式:
-
解码成字符串:
data = ser.readline().decode('utf-8') print("已解码的数据:", data)
-
以十六进制显示:
data = ser.readline() print("以十六进制显示:", data.hex())
第六步:错误处理和资源释放
-
捕获异常: 在
read()
或write()
时可能会出现异常,例如设备脱离或参数配置错误。确保用 try-except块来捕获这些异常。 -
关闭串口连接: 使用完毕后,记得关闭串口释放系统资源:
ser.close()
第七步:将数据保存到文件
如果需要记录接收的数据,可以直接写入文件:
with open("received_data.log", "wb") as f:
while True:
data = ser.read(1024)
if len(data) > 0:
f.write(data)
高级功能:同步读取和超时机制
-
设置超时时间:
ser.timeout = 5 # 等待最多5秒 data = ser.read(1024)
-
使用 inWaiting() 方法检查数据是否可用:
while True: if ser.in_waiting > 0: print("接收到的数据:", ser.readline().decode('utf-8'))
测试你的配置
-
列出系统中所有可用的串口名称: 使用以下代码查看可用端口:
import serial.tools.list_ports as port_list ports = port_list.comports() for p in ports: print(p)
-
验证设备是否工作正常:
- 使用上述代码测试连接。
- 如果使用了新的串口配置,请确保波特率、数据位、停止位和奇偶校验设置与设备一致。
- 使用工具如 Tera Term 或 PuTTY 验证你的装置响应。
完整的示例代码
以下是一个完整的、可运行的代码,用于连接串口并读取数据:
import serial
port_name = 'COM3' # 替换为实际的串口名称
baudrate = 9600 # 根据设备设置调整波特率
try:
with serial.Serial(port=port_name,
baudrate=baudrate,
bytesize=serial.EIGHTBITS,
stopbits=serial.STOPBITS_ONE,
parity=serial.PARITY_NONE) as ser:
if ser.is_open:
print(f"成功连接到 {port_name}")
while True:
data = ser.readline()
if len(data) > 0:
print("接收到的数据:", data.decode('utf-8'))
# 按下 Ctrl+C 退出
try:
pass
except KeyboardInterrupt:
break
except serial.SerialException as e:
print(f"串口连接错误:{e}")
finally:
print("程序结束,确保已安全关闭串口。")
注意事项:
-
串口权限和驱动:
- 在某些系统上,你可能需要管理员权限才能访问串口。
- 确保安装了正确的设备驱动,并且串口被正确识别。
-
波特率和配置:
- 波特率(baudrate)和其他参数必须与设备匹配,否则无法正常通信。
-
平台差异:
- Windows 系统中的串口名称通常以
COM
开头(例如COM1
,COM2
)。 - 在 Linux 中,串口通常位于
/dev/ttysomething
或/dev/ttyUSB*
。
- Windows 系统中的串口名称通常以
-
防止数据丢失: 使用适当的缓冲区或超时机制,以确保不会有太多数据积累而被忽略。