我正在开发需要与许多串行端口通信的应用程序。我还没有找到一种方法来做到这一点,而不使用线程每端口。有没有一种方法可以做到这一点与单线程?例如同时选择或轮询多个端口?我用的是pyserial 2.6
goqiplq21#
我假设你是在一个类似Unix的平台上使用PySerial。由于PySerial对象实现了fileno()来获取底层的文件描述符,因此可以将它们直接传递给select(),这样就可以同时处理多个PySerial对象。另一种方法是以非阻塞(读)模式打开Serial对象(通过传递timeout=0),并处理读取和写入可能返回errno.EWOULDBLOCK错误的事实。这可能是最简单的方法。第三种选择是使用twisted serial ports,如果您不介意了解twisted的工作方式的话。
fileno()
select()
Serial
timeout=0
errno.EWOULDBLOCK
更新
对于Windows,除了使用线程之外,几乎唯一的选择就是使用in_waiting属性。定期轮询所有串行端口,从它们阅读in_waiting。如果有东西等待,那么你可以读取,只有那么多字节没有阻塞。不幸的是,pyserial没有“输出缓冲区中有多少可用空间”的方法,这意味着当你写入串行端口时,你有阻塞的风险。如果您正在实现一个典型的串行端口协议,则默认的几千字节缓冲区大小将确保这通常不会成为问题。
in_waiting
1条答案
按热度按时间goqiplq21#
我假设你是在一个类似Unix的平台上使用PySerial。
由于PySerial对象实现了
fileno()
来获取底层的文件描述符,因此可以将它们直接传递给select()
,这样就可以同时处理多个PySerial对象。另一种方法是以非阻塞(读)模式打开
Serial
对象(通过传递timeout=0
),并处理读取和写入可能返回errno.EWOULDBLOCK
错误的事实。这可能是最简单的方法。第三种选择是使用twisted serial ports,如果您不介意了解twisted的工作方式的话。
更新
对于Windows,除了使用线程之外,几乎唯一的选择就是使用
in_waiting
属性。定期轮询所有串行端口,从它们阅读in_waiting
。如果有东西等待,那么你可以读取,只有那么多字节没有阻塞。不幸的是,pyserial没有“输出缓冲区中有多少可用空间”的方法,这意味着当你写入串行端口时,你有阻塞的风险。如果您正在实现一个典型的串行端口协议,则默认的几千字节缓冲区大小将确保这通常不会成为问题。