我正在尝试编写和阅读,因为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
答案 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中打开并使用它