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 是一条完整的消息,这就无关紧要了。