#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=' ')