我从通过串行微控制器读取数据,在921600.我读了大量的ASCII CSV数据的波特率,并因为它有如此之快,缓冲得到的填充数据的所有其余被丢失之前我可以读取它。 我知道我可以手动编辑serialwin32的pyserial源代码,以增加缓冲区的大小,但我想知道,如果它周围有另一种方式?
我只能估计数据,我将收到的金额,但它是围绕数据的200kB的地方。
我从通过串行微控制器读取数据,在921600.我读了大量的ASCII CSV数据的波特率,并因为它有如此之快,缓冲得到的填充数据的所有其余被丢失之前我可以读取它。 我知道我可以手动编辑serialwin32的pyserial源代码,以增加缓冲区的大小,但我想知道,如果它周围有另一种方式?
我只能估计数据,我将收到的金额,但它是围绕数据的200kB的地方。
有一个“接收缓冲区”滑块的访问从COM端口的属性页中的设备管理器。 它是由继“端口设置”选项卡上的高级按钮找到。
更多信息:
http://support.microsoft.com/kb/131016标题下的接收缓冲区
http://tldp.org/HOWTO/Serial-HOWTO-4.html标题下中断
尽量往下压一个或两个档次。
你有没有考虑在这之前发送命令的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;
你并不需要手动更改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然后打开并使用它
我有些奇怪,没有人没有提到的正确解决这样的问题(当可用时),这是通过用软件(XON / XOFF)或硬件流控制的微控制器和其水槽之间的有效流动控制。 这个问题是很好地说明这个网站的文章 。
这可能是因为源设备不接受这样的协议,在这种情况下,你被卡住了一系列的解决方案,即向上委派的问题更多的资源可用(它从UART缓冲区搬到驾驶员和向上对您的应用程序代码)。 如果你丢失数据,这肯定会似乎明智的尝试和实现更低的数据率,如果这是一个可能性。