【问题标题】:Python - read from serial port and encode as JSONPython - 从串口读取并编码为 JSON
【发布时间】:2015-01-06 11:17:48
【问题描述】:

我在这方面花费了太多时间,但就是想不通。我有一个将 json 字符串写入串行端口的 arduino。字符串如下所示: {"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']

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

【问题讨论】:

  • print(data) 调用移到出错的行上方,这样您就可以看到您得到了什么。 print(repr(data)) 可能会让您更好地了解数据中的实际内容。
  • 确定data 是一个有效的JSON 字符串吗?在尝试使用json.loads 解析它之前尝试将其打印出来
  • data 为空行时会发生什么?
  • 这听起来太像你试图在完成读取之前解析 json 输出。为什么不将 json.loads(data) 移到 while 循环之外

标签: python json serialization arduino


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      相关资源
      最近更新 更多