PySerial 非阻塞读取循环

作者:编程家 分类: python 时间:2025-08-27

使用PySerial进行非阻塞读取循环

在Python中,PySerial是一个非常常用的库,可以用于与串口进行通信。它提供了简单易用的接口,可以用于读取和写入串口数据。然而,在某些情况下,我们可能需要以非阻塞的方式读取串口数据,以便在等待数据返回的同时执行其他任务。在本文中,我们将介绍如何使用PySerial进行非阻塞读取循环,并提供一个案例代码来演示其用法。

案例代码:

python

import serial

import time

def non_blocking_read(port, baudrate, timeout):

ser = serial.Serial(port, baudrate, timeout=timeout)

ser.reset_input_buffer()

ser.reset_output_buffer()

while True:

if ser.in_waiting > 0:

data = ser.read(ser.in_waiting)

print(data)

time.sleep(0.1)

if __name__ == "__main__":

port = "COM1" # 串口号

baudrate = 9600 # 波特率

timeout = 1 # 超时时间(秒)

non_blocking_read(port, baudrate, timeout)

上述代码的功能是以非阻塞的方式读取串口数据,并将其打印出来。代码首先使用`serial.Serial`函数创建一个串口对象,然后通过`reset_input_buffer`和`reset_output_buffer`函数来清空输入缓冲区和输出缓冲区。接下来,代码进入一个无限循环,不断检查串口是否有数据可读。如果有数据可读,则通过`ser.read`函数读取数据,并将其打印出来。为了避免过多占用CPU资源,代码在每次循环之间使用`time.sleep`函数添加一个小的延时。

如何使用PySerial进行非阻塞读取循环

使用PySerial进行非阻塞读取循环非常简单。首先,我们需要创建一个串口对象,通过指定串口号、波特率和超时时间来进行初始化。然后,我们可以使用`reset_input_buffer`和`reset_output_buffer`函数来清空输入缓冲区和输出缓冲区。接下来,我们可以进入一个循环,不断检查串口是否有数据可读。如果有数据可读,我们可以使用`ser.read`函数来读取数据,并进行相应的处理。

案例代码解析:

在上述案例代码中,我们首先使用`serial.Serial`函数创建了一个串口对象,并通过指定串口号、波特率和超时时间来进行初始化。接下来,我们使用`reset_input_buffer`和`reset_output_buffer`函数来清空输入缓冲区和输出缓冲区。这是一个很重要的步骤,因为在开始读取数据之前,我们应该确保输入缓冲区是空的,以避免读取到之前的残留数据。

然后,我们进入一个无限循环,不断检查串口是否有数据可读。在每次循环中,我们使用`ser.in_waiting`属性来获取当前可读取的字节数。如果`ser.in_waiting`大于0,则表示有数据可读。我们使用`ser.read`函数来读取数据,并将其打印出来。请注意,我们在每次循环之间添加了一个小的延时,以避免过多占用CPU资源。