Python-从串行端口读取并编码为JSON
我在这件事上花了太多时间,但就是想不出来。我有一个arduino,它将json字符串写入串行端口。字符串如下所示:{“temp”:“69”,“light”:“141”,“z”:“999”}并验证为有效的json。我试图使用下面的python脚本从串口读取并打印json字符串的各种值Python-从串行端口读取并编码为JSON,python,json,serialization,arduino,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 = seria
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']
任何帮助都将不胜感激。谢谢 因为您正在为串行对象指定(读取)超时,
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)
),例如(备注:效率不高):
现在不需要发送换行符。
请注意,如果嵌套字典,此代码将失败,在这种情况下,您需要跟踪嵌套级别。查看Arduino返回字符串的内容,我猜您正在读取简单的传感器数据,在这种情况下,单个嵌套级别可能就足够了
同样,我认为使用模块名作为变量是不好的,从而使它变得不可访问。您可以在本例中使用串行导入串行
。首先,您必须使用“dot encode()”方法将接收到的字节转换为字符串,然后继续处理json数据将打印(数据)
调用移到出错的行上方,以便查看得到的内容。和print(repr(data))
可能会让您更好地了解数据中的实际内容。您确定data
是有效的JSON字符串吗?在使用json解析之前,请先打印出来。加载。当数据为空行时会发生什么情况?听起来太像是您试图在json输出完成读取之前解析它。为什么不将json.loads(data)
移动到while循环之外呢
input = [' ']
while input[-1] != '}':
input.append(serial.read(1))
data = ''.join(input)
j = json.loads(data)