Использование Python readline () для получения данных нескольких датчиков через USB от Arduino Uno - PullRequest
1 голос
/ 21 апреля 2020

У меня Raspberry pi 3B +, подключенный к Arduino Uno через USB-кабель, и я получаю данные от нескольких датчиков. Я пытаюсь найти лучший способ выделить их в python. Например, если я получу данные вроде:

27.3

0

1

Нужно знать, что первая строка - это температура, вторая строка - обнаружение движения и третья строка - обнаружение шума и т. д. ...

Идея 1) Пусть все датчики обновляются одновременно в одном и том же порядке. Кодируйте его в al oop, чтобы первая readline () сохраняла переменную температуры, вторая строка - переменную движения и т. Д. До тех пор, пока она не вернется назад ...

Идея 2) Установите какой-нибудь флаг перед данными каждого датчика и python прочитайте каждую строку и решите, что с ней делать. Как будто температура будет выводиться как t27.3, а код в python будет видеть t впереди и знать, как взять остальные данные и обновить их на сервере. Я не совсем уверен, как будет выглядеть код для этого

Какой подход был бы лучше (в идеале быстрее)? Если второй, можете ли вы указать мне код для разбора строк? Прошло много времени с тех пор, как я должен был это сделать, я полностью забыл. Спасибо!

1 Ответ

0 голосов
/ 22 апреля 2020

Мое предложение - использовать формат данных, который пригоден для будущего, поэтому давайте используем простой JSON.
Его стандартизированная, фитон имеет встроенную поддержку, и на Arfuino мы можем кодировать вручную без огромных библиотек
Так что здесь два готовых к использованию фрагмента для вашей кратковременной необходимости. Не стесняйтесь приспосабливаться к вашим желаниям и читать комментарии в коде, чтобы узнать больше об используемых функциях

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

import serial
import time
import json

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

buffer = ""

while True:
    try:
            buffer = ser.readline()
            print buffer
            data = json.loads(buffer)
            print data["temperature"]
            temperature = data["temperature"]
            print temperature
            print data["motion "]
            motion  = data["motion "]
            print motion 
            print data["noise"]
            noise = data["noise"]
            print noise

            buffer = ""
            print " "
    except json.JSONDecodeError:
            print "Error : try to parse an incomplete message"

Со стороны Arduino мы используем глобальный массив символов для построения нашего JSON

 char jsonData[256] = {'\0'}; /* Defined globally choose size large enough */
 char numBuffer[16] = {'\0'}; /* Defined globally used for convering numbers to string */

// here we build the JSON

strcpy (jsonData, "{\"temperature\":\"" );
    // If its an int use this command
    //  itoa(temperature, numBuffer, 10); // convert int DATA from sensors etc.
    // For float we use this command    
    // dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);
dtostrf(temperature, 3, 2, numBuffer); // -> xx.xx
 strcat(jsonData, numBuffer);
 strcat (jsonData, "\",\"motion\":\"" );
 itoa(motion, numBuffer, 10); // convert int DATA from sensors etc.
 strcat(jsonData, numBuffer);
 strcat (jsonData, "\",\"noise\":\"" );
 itoa(noise, numBuffer, 10); // convert int DATA from sensors etc.
 strcat(jsonData, numBuffer);
 strcat (jsonData, "\"}");  

 // The JSON data looks like: {"temperature":"21.50","motion":"113","noise":"321"}
 Serial.println(jsonData);

Не забудьте установить одинаковую последовательную скорость на обеих машинах (в ПО) и инициирование с одной стороны, чтобы обеспечить полную передачу JSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...