Pyserial Python с режимом прерывания - PullRequest
0 голосов
/ 28 мая 2018

У меня есть устройство, которое работает на 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.

Спасибо

1 Ответ

0 голосов
/ 28 мая 2018

Я беру удар здесь: ваш time.sleep (5) может быть слишком длинным.Вы пытались сделать сон очень коротким, например, time.sleep (.300)?Если данные о времени записываются обратно между sop-возвратами, вы поймаете их до того, как они будут объединены с sop, но я здесь предполагаю, что они будут отправлять данные о времени назад, иначе в любом случае вы ничего не можете сделать на стороне сервера.(питон) код.Я верю, что не помешает меньше спать, в любом случае это просто сидеть и ждать (опросить) общения.

Отсутствие такой же среды на моей стороне затрудняет ответ,потому что я не могу проверить свой ответ, поэтому я надеюсь, что это может помочь.

...