从串口

时间:2016-07-02 22:35:52

标签: python json

我想使用ijson从串口读取对象。我可以从端口读取,并且我可以使用ijson从流中反序列化对象,但是使用串口的ijson并不是枚举任何东西。

这是我的代码示例:

    self.serial_port = serial.Serial(
        port=self.port_name, \
        baudrate=115200, \
        parity=serial.PARITY_NONE, \
        stopbits=serial.STOPBITS_ONE, \
        bytesize=serial.EIGHTBITS, \
        timeout=None)
    print 'start reading'
    parser = ijson.parse(self.serial_port)

    for prefix, event, value in parser:
        print `value`
    print 'stop reading'

我的输出只是

    start reading

2 个答案:

答案 0 :(得分:1)

尝试做:

import ijson
import sys
for x in ijson.parse(sys.stdin):
    print(x)

您可以输入json,但在按两次Ctrl-D指示stdin结束之前,不会打印任何内容。

我还没有对它进行测试,但我怀疑你的串口发生了类似的情况:因为你的串口永远不会关闭,ijson不知道何时开始解析。根据您的串行库,我会尝试向python发送EOF或EOT字符,或者单独找到一种方法使其触发流的结束。

我可以考虑的一些选择:

  • 分别从ijson读取一行,然后解析它
  • 设置超时或inter_byte_timeout仅从流
  • 读取json的第一段

答案 1 :(得分:0)

好的,我明白了。您必须将缓冲区大小设置为1。 所以,这有效......

objects = ijson.common.items(ijson.parse(self.serial_port, buf_size=1), 'item')
    for o in objects:
        print `o`

我的目标是能够接收无穷无尽的物体。我使用" [",然后发送逗号分隔的json对象列表,并用"]"终止列表来表示流的开始。每次在数组中完成一个对象时,迭代器就会循环。

完美无缺。

通过发送它进行测试(在对象中间的有意换行):

[{"foo": "bar"}, {"bar":
"foo"}]