Должен постоянно контролировать последовательные данные в Python

Прямо сейчас я использую Ардуино для отправки данных от аналогового датчика до COM4. Я пытаюсь сделать сценарий Python, который непрерывно контролирует те данные и ищет определенный параметр.

Я попробовал что-то вроде этого, но это не предупреждает меня правильно

import serial
from Tkinter import *
import tkMessageBox

port = "COM4"
ser = serial.Serial(port,9600)
value = 0

while 1:
    value = ser.read()
    if value > 400:
        tkMessageBox.showwarning(
            "Open file",)
    time.sleep(1)
5
задан dsolimano 17 October 2012 в 18:11
поделиться

3 ответа

Если используемый вами пакет serial - pySerial, обратите внимание на определение метода Serial.read():

read(size=1)

Параметр: size - количество байт для чтения.

Возвращает: Байты, считанные из порта.

Считывание байтов размера size из последовательного порта. Если установлен тайм-аут, программа может вернуть меньше символов, чем требуется. При отсутствии таймаута он будет блокироваться до тех пор, пока не будет считано запрошенное количество байт.

Изменено в версии 2.5: Возвращает экземпляр bytes, если доступно (Python 2.6 и новее) и str в противном случае.

Хотя вы пытаетесь обрабатывать объекты byte, вы можете (в зависимости от версии Python) обрабатывать объекты str или bytes (массивы). Эти объекты не обязательно соответствуют целочисленным значениям.

Даже при получении объектов byte из read() наибольшее беззнаковое целое число будет равно 255. Сравнение value с 400 не имеет смысла. Попробуйте найти тип возвращаемых объектов с помощью простого отладочного вывода.

print type(value)

Если вам нужно обработать объект str, проверьте использование ord() для преобразования.

(Предложение flush относится к исходному вопросу, в котором использовался print, а не tkinter).

См. how-to-flush-output-of-python-print, и попробуйте использовать оболочку командной строки, а не IDE, которая может повлиять на буферизацию вывода.

3
ответ дан 15 December 2019 в 06:19
поделиться

Вместо того, чтобы код Arduino ретранслировать все аналоговые значения в COM4, ​​пусть он передает флаг, только когда вы выполняете условие.

Таким образом, код arduino может быть таким:

void loop() {
  sensorValue = analogRead(sensorPin);
  if (sensorValue >= 400){
    Serial.print("1"); // 1 will be the flag that will be sent to COM4
  }

Тогда ваш код Python может просто искать такой флаг:

import serial
from Tkinter import *
import tkMessageBox

port = "COM4"
ser = serial.Serial(port,9600)
value = 0


while 1:
    value = ser.read();
    print value
    if value == "1":
        tkMessageBox.showwarning("BLAH", "BLAH\n")
        exit()
    else:
        continue
0
ответ дан 15 December 2019 в 06:19
поделиться

Предполагая, что вы используете pySerial , serial.read () читает только один байт, что означает максимальное значение 255. Если ваш Arduino отправляет строковые значения обратно, вероятно, лучше всего разделить их символами новой строки и использовать serial.readline () .

Если у вас нет особых требований к производительности, отправка строк обратно из Arduino в любом случае значительно упростит отладку.

Также, если вы получаете строки обратно от Arduino, ваш тест должен быть , если int (value)> 400:

0
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: