Python的pyserial有中断模式

时间:2018-05-28 12:32:02

标签: python serial-port pyserial

我有一个适用于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中使用中断的好代码。

由于

2 个答案:

答案 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)代码。我确实认为减少睡眠不会有害,无论如何只是坐在那里等待(轮询)进行交流。

没有相同的环境让我难以回答,因为我无法测试我的答案,所以我希望这可能有所帮助。