一、Pyserial 安装
Pyserial 是 Python 中使用串口通信的一个第三方库,使用它可以方便地与设备进行数据交互。在进行 Pyserial 的安装之前,需要确保 Python 已经安装了 Pip 包管理工具,如果没有安装,需要进行安装。
$pip install pyserial
使用上述命令即可快速地完成 Pyserial 的安装。
二、串口 Pyserial 教程
下面我们将介绍 Pyserial 的基础使用方法。在使用 Pyserial 进行串口通信之前,需要先创建一个串口对象。可以通过类似下面的方式创建一个串口对象:
import serial serialPort = serial.Serial(port, baudrate, bytesize, parity, stopbits, timeout)
参数说明:
- port: 端口号。例如 Linux 下的 "/dev/ttyUSB0"。 Windows 下的 "COM1"。
- baudrate: 波特率,可以设置为每秒传输的位数的数量。例如 9600、 115200。
- bytesize: 每个字节的位数。增加时序字节时,字节大小通常为 7 或 8 位。
- parity: 检验位,用于确定发送的数据是否被修改。
- stopbits: 每个信号结束以后的停止位的数量。通常为 1 位或 2 位。
- timeout: 超时时间,如果没有数据可用,等待时间的秒数。
完成创建串口对象以后,就可以通过 write() 函数实现数据的写入。例如下面的代码先向串口写入一串字节数据,然后从串口读取同样长度的数据。
import serial serialPort = serial.Serial("/dev/ttyUSB0", 115200) data = bytes("Hello", 'utf-8') serialPort.write(data) data = serialPort.read(5) print(data)
三、Pyserial 和 Serial 的区别
对于 Python 用户而言,有时会混淆 Pyserial 和 Serial。实际上,Pyserial 是一个 Python 库,而 Serial 是一个单独的串口通信程序。虽然二者都可以用于串口通信,但 Pyserial 与 Python 紧密集成,因此在某些情况下使用 Pyserial 更为方便。
Pyserial 支持多个操作系统,包括 Windows、Linux 和 Mac OS X 等,而 Serial 仅支持 Windows 操作系统。对于仅在 Windows 上运行的应用程序,Serial 可能是更好的选择。
四、Pyserial Gui
Pyserial 还可以与一些图形化界面结合使用,例如 Tkinter。下面的示例演示了如何在 Tkinter 窗口中显示串口接收到的数据。
from tkinter import * import serial class SerialGui(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.serialPort = serial.Serial('/dev/ttyUSB0', 9600) self.parent.after(10, self.update) def update(self): s = self.serialPort.read(1) if s: print(s.decode('utf-8'), end='') self.parent.after(10, self.update) if __name__ == '__main__': root = Tk() app = SerialGui(root) app.mainloop()
五、Pyserial Write
Pyserial 不仅可以读取串口设备中的数据,还可以向串口设备写入数据。下面的示例演示了如何使用 Pyserial 向串口设备发送数据。这里需要注意的是,如果要发送字符串数据,需要先进行编码,将字符串转换为字节数组。
import serial s = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) s.write(b'Hello, World!')
六、Python Serial
Python Serial 是 Pyserial 的一个分支项目,提供了更多的功能和灵活性。如果在使用 Pyserial 的过程中需要更多的功能,建议使用 Python Serial。
七、Pyserial Write 写入大量数据
如果要向串口写入大量数据,在使用 Pyserial 的 write() 函数时需要注意一些问题。当写入大量数据时,需要调用多次 write() 函数来实现。然而,如果两个 write() 函数的调用间隔过短,会导致写入的数据无法被设备完全接收。在调用 write() 函数之前,我们需要知道缓冲区的状态。可以通过 in_waiting 属性获取到当前缓冲区剩余可用字节数。
import serial serialPort = serial.Serial("/dev/ttyUSB0", 115200) # 获取缓冲区剩余可用字节数 buffer_size = serialPort.in_waiting # 检查缓冲区是否已满 if buffer_size > 256: time.sleep(0.5) # 向串口发送大量数据 for i in range(10000): data = bytes(str(i) + '\n', 'utf-8') serialPort.write(data)
在写入数据之前,需要检查缓冲区的状态,并在必要时等待缓冲区可用。通过这种方式可以确保写入的数据得到了设备的完整接收。