Как разбить последовательный ввод на сообщения - PullRequest
0 голосов
/ 07 октября 2019

У меня есть 2 последовательных порта на Raspberry Pi. В настоящее время код считывает данные с порта 1 и записывает их на порт 2 и наоборот. Я пытаюсь разделить входные данные, которые я читаю с обоих портов, и разделить их на различные сообщения (группы символов) на основе указанного символа (например, # или!)

Кроме того, как можноВ конце я изменяю текущий цикл for, чтобы можно было разделять сообщения для обоих портов, в настоящее время код записывается только для разделения данных с 1 порта.

Я уже пробовал split (), и он выдает ошибку типа. Причина может заключаться в том, что последовательный ввод может быть другого типа

import serial
ser1 = serial.Serial('/dev/ttyUSB0', timeout=2)
ser2 = serial.Serial('/dev/ttyUSB1', timeout=2)
print (ser1)
print (ser2)
ser1_list = []
ser2_list = []

while (True):
    data1 = ser1.readlines()
    data2 = ser2.readlines()
    if data1 or data2:
        ser1_list.extend(data1)
        ser2.writelines(data1)
        byte_split1 = ser1_list.split("1")
        ser2_list.extend(data2)
        ser1.writelines(data2)
        byte_split2 = ser1.split('1')
        for x in byte_split1:
            print(x)
    else:
        break
ser1.close()
ser2.close()

Пример ожидаемого результата: Если ввод:

abcde#fghi#jklmnop#

, он будет выводить:

abcde
fghi
jklmnop

1 Ответ

0 голосов
/ 07 октября 2019

Похоже, вы пытаетесь настроить что-то вроде чата между двумя локациями. Пожалуйста, подумайте о том, как это сделать каноническим способом:

Разделите это на параллельные процессы, один для ser1 => ser2, а другой для ser2 => ser1. Каждый процесс будет обрабатывать связь в своем собственном направлении.

Это позволяет вам написать по одному listener для каждого порта;ваши два процесса будут идентичны, за исключением того, что вы создаете их экземпляры с портами в обратном порядке. Каждый слушатель собирает трафик, пока не доберется до разделителя;в этот момент он записывает содержимое буфера до этой точки и перемещает указатель буфера. Есть много пакетов ввода / вывода, чтобы сделать это для вас;вы просто «разбиваете» поток с этим символом-разделителем.

Этого должно быть достаточно, чтобы вы могли найти примеры, которые вам нужны.

...