Python,读串口,post转MQTT,有多余空格
Python, read uart and post to MQTT, has extra spaces
我正在使用 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
知道这些新线路的来源吗?
你没有在变量中保存 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")
print(rcv)
添加换行符。要将其更改为 space(例如),请尝试以下操作:
print(rcv, end=' ')
基本上,你的 readlineCR 不应该 returning rv 当它没有从 read 中得到任何东西时 - 它永远不需要 return 直到完整的字符串 rv 字符串以 \r\n 结尾,然后它可以 return rstripped string:
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if rv.endswith("\r\n"):
return rv.rstrip()
此外,我不明白您为什么要检查 rcv 的长度 - 但只要 rcv 是一条完整的消息,这就无关紧要了。
我正在使用 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
知道这些新线路的来源吗?
你没有在变量中保存 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")
print(rcv)
添加换行符。要将其更改为 space(例如),请尝试以下操作:
print(rcv, end=' ')
基本上,你的 readlineCR 不应该 returning rv 当它没有从 read 中得到任何东西时 - 它永远不需要 return 直到完整的字符串 rv 字符串以 \r\n 结尾,然后它可以 return rstripped string:
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if rv.endswith("\r\n"):
return rv.rstrip()
此外,我不明白您为什么要检查 rcv 的长度 - 但只要 rcv 是一条完整的消息,这就无关紧要了。