Python - 从串口读取并编码为JSON

时间:2014-11-10 07:41:40

标签: python json serialization arduino

我在这方面花了太多时间但却无法理解。我有一个arduino将json字符串写入串口。字符串如下所示:{“temp”:“69”,“light”:“141”,“z”:“999”}并验证为有效的json。我试图使用以下python脚本从串口读取并打印出json字符串的各种值。

import serial
import json

serial = serial.Serial("/dev/ttyUSB0", 9600, timeout=1)
while True:
 data = serial.readline().strip('\n\r')
 j = json.loads(data)
 print(data)
 print j['temp']

无论我尝试更改什么,我最终会收到此错误消息:无法解码JSON对象。然而,这完美无缺:

import json

data = '{"temp":"95","light":"200","z":"999"}'
j = json.loads(data)
print(data)
print j['temp']

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

因为您为串行对象指定了(读取)超时,所以readline方法如果在达到超时之前找不到\n,则可能返回空字符串。这确实会导致您所描述的错误:

In [18]: import json

In [19]: json.loads('')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
[ stripping extra output - merely an example ]

ValueError: No JSON object could be decoded

确保您的Arduino正在发送以换行符结尾的字符流。如果您的Arduino代码使用Serial.println(yourJSONdata)代替Serial.print(val),则应自动处理。

或者,一次解析串行输入缓冲区一个字符(Serial.read(1)),例如这样(注释:效率不高):

input = [' ']
while input[-1] != '}':
    input.append(serial.read(1))
data = ''.join(input)
j = json.loads(data)

现在不需要发送换行符。 请注意,如果嵌套字典,此代码将失败,在这种情况下,您需要跟踪嵌套级别。看看你的Arduino返回字符串的内容,我想你正在读出简单的传感器数据,在这种情况下,单个嵌套级别可能已经足够了。

另外,我认为将模块名称用作变量是不好的形式,从而使其无法访问。您可以在案例中使用from serial import Serial

答案 1 :(得分:0)

首先,您必须使用“点编码()”方法将接收到的字节转换为字符串,然后继续处理json数据