如何扩展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的输入缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章