Pyserial缓冲区填满的速度比我能读(Pyserial buffer fills faster

2019-07-28 22:53发布

我从通过串行微控制器读取数据,在921600.我读了大量的ASCII CSV数据的波特率,并因为它有如此之快,缓冲得到的填充数据的所有其余被丢失之前我可以读取它。 我知道我可以手动编辑serialwin32的pyserial源代码,以增加缓冲区的大小,但我想知道,如果它周围有另一种方式?

我只能估计数据,我将收到的金额,但它是围绕数据的200kB的地方。

Answer 1:

有一个“接收缓冲区”滑块的访问从COM端口的属性页中的设备管理器。 它是由继“端口设置”​​选项卡上的高级按钮找到。

更多信息:

http://support.microsoft.com/kb/131016标题下的接收缓冲区

http://tldp.org/HOWTO/Serial-HOWTO-4.html标题下中断

尽量往下压一个或两个档次。



Answer 2:

你有没有考虑在这之前发送命令的uC发送数据运行一个单独的线程从串行接口读?

这将消除一些写命令后的延迟,并开始读。 还有其他的,这样用户谁曾用此方法成功,授予他们没有缓冲区溢出。

如果这是不明确让我知道,我可以扔的东西一起做展示。

编辑

关于它的思考多一点,如果你想从缓冲区读取并写入到文件系统,即使在独立线程可能救不了你。 为了尽量减少处理时间你可能会考虑读说在一个时间100个字节serial.Read(size=100)并推动数据到一个队列来处理它全部转让完成后,

伪码示例

def thread_main_loop(myserialobj, data_queue):
    data_queue.put_no_wait(myserialobj.Read(size=100))

def process_queue_when_done(data_queue):
    while(1):
        if len(data_queue) > 0:
            poped_data = data_queue.get_no_wait()
            # Process the data as needed
        else:
            break;


Answer 3:

你并不需要手动更改pyserial代码。

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

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

其中12800是我选择了一个任意数字。 您可以接收(RX)和发射(Tx)缓冲器一样大2147483647a


也可以看看:

https://docs.python.org/3/library/ctypes.html

https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readbuffersize(v=vs.110).aspx

您可能能够设置从DLL //设置串口串口

 mySerialPort.BaudRate = 9600;
 mySerialPort.PortName = comPort;
 mySerialPort.Parity = Parity.None;
 mySerialPort.StopBits = StopBits.One;
 mySerialPort.DataBits = 8;
 mySerialPort.Handshake = Handshake.None;
 mySerialPort.RtsEnable = true;
 mySerialPort.ReadBufferSize = 32768;

属性值类型:System.Int32缓冲区大小,以字节为单位。 默认值是4096; 最大值是一个正为int,或2147483647

在Python然后打开并使用它



Answer 4:

我有些奇怪,没有人没有提到的正确解决这样的问题(当可用时),这是通过用软件(XON / XOFF)或硬件流控制的微控制器和其水槽之间的有效流动控制。 这个问题是很好地说明这个网站的文章 。

这可能是因为源设备不接受这样的协议,在这种情况下,你被卡住了一系列的解决方案,即向上委派的问题更多的资源可用(它从UART缓冲区搬到驾驶员和向上对您的应用程序代码)。 如果你丢失数据,这肯定会似乎明智的尝试和实现更低的数据率,如果这是一个可能性。



文章来源: Pyserial buffer fills faster than I can read