Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-从串行端口读取并编码为JSON_Python_Json_Serialization_Arduino - Fatal编程技术网

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

我在这件事上花了太多时间,但就是想不出来。我有一个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']

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

因为您正在为串行对象指定(读取)超时,
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)