2016-11-27 1 views
0

У меня есть вопрос о моем коде. Речь идет о связи между Arduino и малина с последовательной связи и формате Json.Получите сообщения json в малиновом коде Python, отправленные Arduino

Вот мой питон скрипт для Малина:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import serial 
import time 
import simplejson as json 

ser = serial.Serial('/dev/ttyACM0',9600) 

buffer = "" 

while True: 
    try: 
      buffer = ser.readline() 
      print buffer 
      data = json.loads(buffer) 
      print data["three"] 
      three = data["three"] 
      print three 
      #rcv = dummy.split() 
      #print(rcv) 
      buffer = "" 
      print " " 
    except json.JSONDecodeError: 
      print "Error : try to parse an incomplete message" 

Вот мой Arduino код:

int one=1; 
int two=2; 
int three = 3; 
int four = 4; 

void setup() { 
    Serial.begin(9600); 
} 

void loop() { 

    Serial.println("'{\"one\":\"" + String(one) + 
    "\", \"two\":\"" + String(two) + 
    "\", \"three\":\"" + String(three) + 
    "\", \"four\":\"" + String(four) + 
    "\"}'"); 

} 

В коде питона, buffer возвращается:

'{ "один": "1", "два": "2", "три": "3", "четыре": "4"}'

В теории three возвращается:

я проверить его в питон консоли, и она работает (без последовательной связи):

buffer = '{"one":"1", "two":"2", "three":"3", "four":"4"}' 
data = json.loads(buffer) 
three=data["three"] 
print three 3 

и это возвращение как и ожидалось:


Но в реальном коде времени, я не могу получить значение three и json.loads(buffer) возникает ошибка все время:

Ошибка: попытайтесь разобрать неполное сообщение

'{"one": "1", "two": "2", "three": "3", " четыре ":" 4" } '

Ошибка: пытаться разобрать неполное сообщение

' { "один": "1", "два": "2", "три": "3", «четыре»: «4»} '

В этом случае мой код не работает. Цель состоит в том, чтобы получить все значения, посылаемые Arduino в разных переменных в python.

спасибо.

+0

Попробуйте напечатать фактические ошибки и 'buffer' при возникновении ошибки:' кроме json.JSONDecodeError, как например: печать ех; print buffer' Я подозреваю, что вам нужно будет ввести некоторые «зависания» (т.е. 'sleep'), чтобы убедиться, что код Arduino записывает все до того, как код Python пытается его прочитать. – DeepSpace

+0

Возвращает> Ожидающее значение: строка 1 столбец 1 (char 0) Ошибка: попытайтесь разобрать неполное сообщение > '{"one": "1", "two": "2", "three": " 3 "," four ":" 4 "} 'Буфер, как правило, правильный, и печать буфера работает. – Arnould

+0

Я хочу, чтобы Arduino запускался при запуске программы Python. Таким образом, программа python откроет последовательный порт в какой-то случайный момент времени, возможно, в середине предложения, которое отправляется в малину. Таким образом, ошибки могут возникать при анализе незавершенных строк JSON. –

ответ

0

Правильный JSON для Arduino код:

Serial.println("{\"one\":\"" + String(one) + 
       "\", \"two\":\"" + String(two) + 
       "\", \"three\":\"" + String(three) + 
       "\", \"four\":\"" + String(four) + 
       "\"}"); 
Смежные вопросы