Python,读取uart并发布到MQTT,有额外的空格

时间:2016-10-21 06:50:05

标签: python newline mqtt

我正在使用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

这些新线的来源是什么?

3 个答案:

答案 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是一个完整的信息,它就不会有问题。