对于嵌入式设备,串口可谓是最常用的接口。在嵌入式操作系统中,串口通常会作为系统的控制台接口。如果同时掌握了Python操作串口的方法,那我们就可以利用Python强大的数据处理能力,快速开发出许多好用的工具。

1 确定串口号

import serial
import serial.tools.list_ports
 
# 获取所有串口设备实例。
# 如果没找到串口设备,则输出:“无串口设备。”
# 如果找到串口设备,则依次输出每个设备对应的串口号和描述信息。
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])
jetson@yahboom:~/Desktop/ZJC-PyTest$ python3 test_Serial.py 
可用的串口设备如下:
/dev/ttyUSB1 USB Serial
/dev/ttyUSB0 USB Serial

2 配置串口并打开

# 方式:调用函数接口打开串口时传入配置参数
import serial

ser = serial.Serial("/dev/ttyUSB1", 115200)    # 打开/dev/ttyUSB1,将波特率配置为115200,其余参数使用默认值
if ser.isOpen():                        # 判断串口是否成功打开
    print("打开串口成功。")
    print(ser.name)    # 输出串口号
else:
    print("打开串口失败。")
jetson@yahboom:~/Desktop/ZJC-PyTest$ python3 test_Serial.py 
打开串口成功。
/dev/ttyUSB1

在使用 serial.Serial() 创建串口实例时,可以传入的参数很多,常用的参数(默认值用红色标记)请参考 用 Python 玩转串口(基于 pySerial)

3 关闭串口

import serial
 
ser = serial.Serial("/dev/ttyUSB1", 115200)    # 打开 /dev/ttyUSB1,将波特率配置为115200,其余参数使用默认值
if ser.isOpen():                        # 判断串口是否成功打开
    print("打开串口成功。")
else:
    print("打开串口失败。")
 
ser.close()
if ser.isOpen():                        # 判断串口是否关闭
    print("串口未关闭。")
else:
    print("串口已关闭。")
jetson@yahboom:~/Desktop/ZJC-PyTest$ python3 test_Serial.py 
打开串口成功。
串口已关闭。

4 接收数据

关于 read() 方法,需要了解如下几点:

  1. read() 方法默认一次读取一个字节,可以通过传入参数指定每次读取的字节数。
  2. read() 方法会将读取的内容作为返回值,类型为 bytes。
  3. 在打开串口时,可以为 read() 方法配置超时时间。
import serial
 
# 打开 /dev/ttyUSB1,将波特率配置为115200, 读超时时间为1秒
ser = serial.Serial(port="/dev/ttyUSB1", baudrate=115200, timeout=1)
 
# 读取串口输入信息并输出。
while True:
    com_input = ser.read(10)
    if com_input:   # 如果读取结果非空,则输出
        print(com_input)
 
ser.close()

注意使用 read() 的时候,如果不进行decode,收到的将是带有b’开头的。

同时还有其他的读取函数,例如
readline() 函数
readlines() 函数
read_until() 函数

x = ser.read()          # read one byte
s = ser.read(10)        # read up to ten bytes (timeout)
line = ser.readline()   # read a '\n' terminated line

更多好用函数可以查看类定义 class serial.Serial

5 发送数据

关于write() 方法,需要了解如下几点:

  1. write() 方法只能发送 bytes 类型的数据,所以需要对字符串进行 encode 编码。
  2. write() 方法执行完成后,会将发送的字节数作为返回值。
  3. 在打开串口时,可以为 write() 方法配置超时时间。
import serial
 
# 打开 /dev/ttyUSB1,将波特率配置为115200.
ser = serial.Serial(port="/dev/ttyUSB1", baudrate=115200)
 
# 串口发送 ABCDEFG,并输出发送的字节数。
write_len = ser.write("ABCDEFG".encode('utf-8'))
print("串口发出{}个字节。".format(write_len))
 
ser.close()
jetson@yahboom:~/Desktop/ZJC-PyTest$ python3 test_Serial.py 
串口发出7个字节。

同时还有其他的写入函数,例如
writelines() 函数

更多好用函数可以查看类定义 class serial.Serial

Ref.

  1. 用 Python 玩转串口(基于 pySerial)
  2. pySerial
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐