首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -从串口读取并编码为JSON

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

Stack Overflow用户
提问于 2014-11-10 07:41:39
回答 2查看 6.8K关注 0票数 2

我在这件事上花了太多时间,但还是搞不清楚。我有一个arduino,它将一个json字符串写入串行端口。字符串看起来如下:{"temp":"69","light":"141","z":"999"},并验证为有效的json。我试图使用下面的python脚本从串口读取,并打印出json字符串的各种值。

代码语言:javascript
运行
复制
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对象无法解码。然而,这是完美的:

代码语言:javascript
运行
复制
import json

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-11-11 00:39:31

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

代码语言:javascript
运行
复制
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)),例如如下所示(注意:它不是很有效):

代码语言:javascript
运行
复制
input = [' ']
while input[-1] != '}':
    input.append(serial.read(1))
data = ''.join(input)
j = json.loads(data)

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

此外,我认为使用模块名作为变量是不好的形式,从而使其无法访问。您可以在您的情况下使用from serial import Serial

票数 1
EN

Stack Overflow用户

发布于 2020-12-06 20:50:26

首先,必须使用"dot ()“方法将接收到的字节转换为字符串,然后继续使用json数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26838953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档