Python Pyserial串行缓冲区

时间:2014-11-25 15:19:11

标签: python python-2.7 serial-port buffer pyserial

我正在尝试编写和阅读,因为Python会让我通过串口。问题是我写得很快而且无法正常工作。我相信问题必须是串行缓冲区,而且我可能会编写输入缓冲区。我可以增加输入和输出缓冲区吗?他们的任何方法或函数或标志是告诉缓冲区何时满,空或忙?我正在尝试尽快一遍又一遍地发送这两个命令

ser = serial.Serial(port=2,baudrate=28800, timeout = 1)
#print ser

ser.flushInput()  #flush input buffer, discarding all its contents
ser.flushOutput() #flush output buffer, aborting current output
                  #and discard all that is in buffer    


ON = ":00000008f8"
PGMMEM0 = ":01f0000011FE" #program one memory location

start = timeit.default_timer()

for i in range(10):

   ser.write(ON)

   end = timeit.default_timer() - start
   print end

   ser.write(PGMMEM0)

   end = timeit.default_timer() - start
   print end

3 个答案:

答案 0 :(得分:1)

是的,您可以使用Serial.outWaiting()方法检查还有多少数据仍在等待发送。

我不确定Serial.write()方法的确切行为,如果它只是在返回之前将数据添加到内部缓冲区。为了满足上述需求,必须采用这种方式,但另一方面需要nonblocking()才能使其无阻塞。这有点令人困惑。

答案 1 :(得分:0)

问题可能出在波特率上。您可以在constructor中设置波特率,确保配置了两个串行链接伙伴:

ser = serial.Serial(baudrate=9600)

如果写入操作后的延迟有效,您可以为串口交互创建一个包装类,例如:

class RS232(object):

  def __init__ (self):
      self.ser = serial.Serial(port=2,baudrate=28800, timeout = 1)

  def write(self,s):
      self.ser.write(s)
      time.sleep(0.5)

myRS232 = RS232()
myRS232.write('whatever')

答案 2 :(得分:0)

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

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

其中12800是我选择的任意号码。您可以将接收(rx)和发送(tx)缓冲区设置为2147483647

另见:

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;最大值是正整数,或2147483647

然后在Python中打开并使用它