Python, считывающий uart и отправляющий в MQTT, содержит дополнительные пробелы

#python #newline #mqtt

#python #новая строка #mqtt

Вопрос:

Я считываю строку с микроконтроллера на Raspberry Pi, используя Python. Строка выглядит следующим образом:

5050313 9

Затем я разделил это на тему MQTT и полезную нагрузку. Значение слева от » » — это тема, а значение справа от » » — полезная нагрузка. Мой код добавляет дополнительные новые строки в раздел MQTT. Как я могу избежать этих новых строк? Я даже попробовал rstrip () для полезной нагрузки. Вот код:

 import serial
import time
import paho.mqtt.publish as publish

def readlineCR(port):
    rv = ""
    while True:
        ch = port.read()
        rv  = ch
        if ch=='rn' or ch=='':
                return rv


port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=3.0)

while True:
    rcv = port.readline()
    print(rcv)
    if len(rcv) > 4:
         mytopic, mypayload = rcv.split(" ")
         mypayload.rstrip()
         publish.single(mytopic, mypayload, hostname="localhost")
  

Если я подписываюсь на эту тему, я получаю именно это:

pi@raspberrypi:/media/pycode $ mosquitto_sub -h localhost -t 50C51C570B00

97

98

99

Между числами не должно быть никаких дополнительных строк. Это должно быть просто

97
98
99

Есть идеи, откуда берутся эти новые строки?

Комментарии:

1. Вы вызываете port.readline() в цикле. Я предполагаю, что вы получаете несколько строк с более чем 4 символами (например, rn97rn ). Я бы проверил количество символов, прочитанных за итерацию цикла, а затем рассмотрел подход после.

2. вы не сохранили результат mypayload.rstrip() в переменной, а затем отправили эту переменную

Ответ №1:

В принципе, ваш readlineCR не должен возвращать rv, когда он ничего не получает от read — он никогда не должен возвращаться, пока полная строка rv string не закончится на r n, и тогда он может вернуть rstripped string:

 def readlineCR(port):
    rv = ""
    while True:
        ch = port.read()
        rv  = ch
        if rv.endswith("rn"):
            return rv.rstrip()
  

Кроме того, я не понимаю, почему вы проверяете длину rcv — но это не будет иметь значения, как только rcv станет полным сообщением.

Ответ №2:

вы не сохранили результат mypayload.rstrip() в переменной, затем отправили эту переменную, т.е. ( mpayload не затронуто) посмотрите на этот пример:

 >>> s='rn97rn'
>>> s.strip()
'97'
>>> s
'rn97rn'
  

ваш код должен быть:

 if len(rcv) > 4:
         mytopic, mypayload = rcv.split(" ")
         v=mypayload.strip()
         publish.single(mytopic, v, hostname="localhost")
  

Ответ №3:

print(rcv) добавляет новую строку. Чтобы изменить это на пробел (например), попробуйте это:

print(rcv, end=' ')