Многострочное последовательное чтение в Python 3 - PullRequest
0 голосов
/ 15 января 2019

Я играю с двунаправленной последовательной связью между моим ПК и платой разработки STM32.Я использую Python 3.7 с PySerial 3.4 , чтобы открыть последовательный порт и получать / принимать сообщения от / на плату разработчика.Все работает как положено, кроме случаев, когда я пытаюсь читать и печатать многострочные сообщения.В этом случае я получаю только первую строку сообщения.

Программа на микроконтроллере такова, что я получаю многострочное справочное сообщение, если я посылаю 'H' через последовательный порт на плату контроллера.Многострочное сообщение, которое отправляет доска разработчиков, выглядит следующим образом:

"HELP\r\nList of commands:\r\nH:  Display list of commands\r\nS:  Start the application"

Поэтому я ожидаю увидеть следующую распечатку:

HELP
List of commands:
H:  Display list of commands
S:  Start the application

Но вместо этого я получаю только:

HELP

Если я подключусь к порту с помощью PuTTY и вручную отправлю 'H', я получу полное сообщение;так что я знаю, что это не проблема моей программы микроконтроллера.

Мой код Python выглядит следующим образом:

import serial
import io

class mySerial:
    def __init__(self, port, baud_rate):
        self.serial = serial.Serial(port, baud_rate, timeout=1)
        self.serial_io_wrapped = io.TextIOWrapper(io.BufferedRWPair(self.serial, self.serial))

    # receive message via serial
    def read(self):
        read_out = None
        if self.serial.in_waiting > 0:
            read_out = self.serial_io_wrapped.readline()
        return read_out

    # send message via serial
    def write(self, message):
        self.serial.write(message)

    # flush the buffer
    def flush(self):
        self.serial.flush()


commandToSend = 'H'
ser = mySerial('COM9', 115200)

ser.flush()
ser.write(str(commandToSend).encode() + b"\n")

while True:
    incomingMessage = ser.read()
    if incomingMessage is not None:
        print(incomingMessage)

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 20 января 2019

Вам нужно ждать новых данных после каждой строки. Исходя из этого, ваш метод чтения необходимо изменить, как показано ниже:

def read(self):
    read_out = None
    timeout = time.time() + 0.1
    while ((self.serial.in_waiting > 0) and (timeout > time.time())):
        pass
    if self.serial.in_waiting > 0:
        read_out = self.serial_io_wrapped.readline()
    return read_out
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...