2016-07-02 19 views
0

ijsonを使用してシリアルポートからオブジェクトを読み取ろうとしています。私はポートの細かい部分から読むことができます。ストリームからオブジェクトを逆シリアル化するためにijsonを使用できますが、シリアルポートからijsonを使用するだけでは何も列挙されません。jsonオブジェクトをシリアルポートから読み取る

これは私のコードの例です:

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 

答えて

1

です:

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

あなたはJSONで入力することができますが、何も印刷されませんCtrl + Dを2回押してstdinの終わりを知らせるまで、このボタンを押し続けてください。

私はそれをテストしていませんが、シリアルポートで何か似たようなことが起こっていると思われます。シリアルポートが決して閉じないので、ijsonはいつ解析を開始するのかわかりません。あなたのシリアルライブラリに応じて、私はPythonにEOFまたはEOT文字を送信しようとするか、別にストリームの終わりをトリガーする方法を見つけようとします。

私はオフに考えることができるいくつかのオプション:

  • がijsonとは別に、単一のラインを読み、[ストリームのみ
  • からJSONの最初のセグメントを読み込むためのタイムアウトまたは inter_byte_timeoutを設定
  • それを解析
+0

おかげデニス。私はEOS/EOTに頼ることはできませんが、私はストリーミングオブジェクトを保つつもりです。しかし、良い提案。解決策は、単にバッファサイズを1にすることでした。 – Adam

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"}] 
関連する問題