您的位置:

深入了解 Pyserial——Python 串口通信库

一、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)

在写入数据之前,需要检查缓冲区的状态,并在必要时等待缓冲区可用。通过这种方式可以确保写入的数据得到了设备的完整接收。