我在这件事上花了太多时间,但还是搞不清楚。我有一个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']任何帮助都将不胜感激。谢谢!
发布于 2014-11-11 00:39:31
因为要为串行对象指定一个(读取)超时,所以如果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。
https://stackoverflow.com/questions/26838953
复制相似问题