我正在使用Python从微控制器读取字符串到Raspberry Pi。字符串如下所示:
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=='\r\n' 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
这些新线的来源是什么?
答案 0 :(得分:0)
你确实在变量中保存了mypayload.rstrip()
的结果然后发送这个变量,即(mpayload
没有受到影响)看看这个例子:
>>> s='\r\n97\r\n'
>>> s.strip()
'97'
>>> s
'\r\n97\r\n'
你的代码应该是:
if len(rcv) > 4:
mytopic, mypayload = rcv.split(" ")
v=mypayload.strip()
publish.single(mytopic, v, hostname="localhost")
答案 1 :(得分:0)
print(rcv)
添加换行符。要将其更改为空格(例如),请尝试以下操作:
print(rcv, end=' ')
答案 2 :(得分:0)
基本上,你的readlineCR在读取内容时不应该返回rv - 它必须永远不会返回,直到完整的字符串rv字符串以\ r \ n结尾,然后它才能返回rstripped字符串:< / p>
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if rv.endswith("\r\n"):
return rv.rstrip()
另外,我不明白你为什么要检查rcv的长度 - 但是一旦rcv是一个完整的信息,它就不会有问题。