如何扩展pyserial的输入缓冲区大小

Posted

技术标签:

【中文标题】如何扩展pyserial的输入缓冲区大小【英文标题】:How to expand input buffer size of pyserial 【发布时间】:2012-09-06 14:16:58 【问题描述】:

我想通过串口与手机通信。在给手机写了一些命令后,我使用ser.read(ser.inWaiting()) 来获取它的返回值,但我总是得到1020 bytes 个字符,实际上,期望的返回应该超过50KB

我尝试设置ser.read(50000),但解释器会挂起。

如何扩展输入缓冲区以一次获得所有返回?

【问题讨论】:

可能是OS setting? 【参考方案1】:

如果您在 Windows 平台上运行代码,您只需在代码中添加一行。

ser.set_buffer_size(rx_size = 12800, tx_size = 12800)

其中 12800 是我选择的任意数字。您可以将接收(rx)和发送(tx)缓冲区设为 2147483647(等于 2^31 - 1)

这将允许您扩展输入缓冲区以一次获取所有返回。

请注意,这仅适用于某些驱动程序,因为这是一项建议。驱动程序可能不会接受您的建议,并且会坚持使用其原始缓冲区大小。

【讨论】:

请记住,此命令是对驱动程序的建议。它仅适用于某些驱动程序。原则上,这应该与平台无关。我曾使用过不接受此建议的 Windows 驱动程序。 您从中调用方法的 ser 对象是什么?我从import serial 尝试了端口和串行,但两次我分别得到AttributeError: 'Serial' object has no attribute 'set_buffer_size'AttributeError: module 'serial' has no attribute 'set_buffer_size'【参考方案2】:

我遇到了完全相同的问题,包括 1020 字节的缓冲区大小,但还没有找到改变它的方法。我的解决方案是实现如下循环:

in_buff=''
while mbed.inWaiting():
    in_buff+=mbed.read(mbed.inWaiting())    #read the contents of the buffer
    time.sleep(0.11)     #depending on your hardware, it can take time to refill the buffer

如果有人能提出调整缓冲区大小的解决方案,我将非常高兴!

【讨论】:

【参考方案3】:

我猜您正在读取 1020 个字节,因为缓冲区中只有这些,这就是 ser.inWaiting() 返回的内容。根据波特率,传输 50 KB 可能需要一段时间,或者手机期待的内容与您不同。握手?

检查 ser.inWaiting 的值,然后检查您正在收到的内容的内容是否有提示。

【讨论】:

【参考方案4】:

pySerial 使用本机操作系统驱动程序进行串行接收。在 Windows 的情况下,输入驱动程序的大小取决于设备驱动程序。

如果可能,您可以在设备管理器设置中增加大小,但最终您只需要足够快地读取数据。

【讨论】:

以上是关于如何扩展pyserial的输入缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 MediaCodec 创建的编码器缓冲区大小

linux kfifo 为啥 保证缓冲空间的大小为2的次幂

Linux AIO:扩展性差

c++中用new给未知大小的数组分配空间怎么弄?

如何设置XShell最大的显示行数

如何动态知道 TCP 缓冲区大小