我有一个适用于serial communication
的设备。我正在编写python代码,它将发送一些命令以从设备获取数据。
有三个命令。
1.COMMAND - sop
Device does its internal calculation and sends below data
Response - "b'SOP,0,921,34,40,207,0,x9A\r\n'"
2.COMMAND - time
This gives a date time values which normally do not change untill the device is restarted
3.START - "\r\r" or (<cr><cr>)
This command puts the device in responsive mode after which it responds to above commands. This command is basically entering <enter> twice & only have to do once at the start.
现在我面临的问题是,从sop
命令接收的数据频率不固定,因此可以随时接收数据。一旦启动此命令也无法停止,因此如果我运行另一个命令time
并读取数据,我将无法接收时间值,并且有时会将它们与sop
数据合并。以下是我正在使用的代码:
port = serial.Serial('/dev/ttyS0',115200) #Init serial port
port.write(("\r\r".encode())) #Sending the start command
bytesToRead = port.in_waiting #Checking data bytesize
res = port.read(bytesToRead) #Reading the data which is normally a welcome msg
port.reset_input_buffer() #Clearing the input serial buffer
port.reset_output_buffer() #Clearing the output serial buffer
port.write(("sop\r".encode())) #Sending the command sop
while True:
time.sleep(5)
bytesToRead = port.in_waiting
print(bytesToRead)
res = port.read(bytesToRead)
print(res)
port.reset_input_buffer()
port.write(("time\r".encode()))
res = port.readline()
print(res)
使用上面的命令我有时在执行命令后没有收到时间值,或者有时它与sop
命令合并。同样使用sop命令,我在sleep(5)
期间收到了大量数据,我需要获取最新数据。如果我不包含sleep(5)
,我会错过sop
数据,然后在执行time
命令后收到该数据。
我希望有人能指出我如何以更好的方式设计它的正确方向。此外,我认为这可以很容易地使用中断处理程序完成,但我没有找到任何关于pyserial中断的代码。任何人都可以建议一些在pyserial中使用中断的好代码。
由于
答案 0 :(得分:1)
与其使用time.sleep()代替,不如使用serialport.in_waiting来帮助检查rcv缓冲区中可用的字节数。 因此,一旦有一些数据是rcv缓冲区,则只能使用读取功能读取数据。 因此可以遵循以下代码序列而不会产生任何延迟
while True:
bytesToRead = port.in_waiting
print(bytesToRead)
if(bytestoRead > 0):
res = port.read(bytesToRead)
print(res)
port.reset_input_buffer()
# put some check or filter then write data on serial port
port.write(("time\r".encode()))
res = port.readline()
print(res)
答案 1 :(得分:0)
我在这里采取刺:你的time.sleep(5)可能太长了。你有没有试过让睡眠时间很短,比如time.sleep(.300)?如果时间数据在sop返回之间被写回来,你将在它与sop合并之前捕获它,但是我在这里假设它将发送时间数据,否则无论如何在服务器端你无能为力(python)代码。我确实认为减少睡眠不会有害,无论如何只是坐在那里等待(轮询)进行交流。
没有相同的环境让我难以回答,因为我无法测试我的答案,所以我希望这可能有所帮助。