Нужно постоянно следить за последовательными данными в Python - PullRequest
5 голосов
/ 02 мая 2010

Сейчас я использую Arduino для отправки данных с аналогового датчика на 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)

Ответы [ 3 ]

3 голосов
/ 02 мая 2010

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

read(size=1)

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

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

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

Изменено в версии 2.5: Возвращает экземпляр байтов , когда он доступен (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, которая может повлиять на буферизацию вывода.

0 голосов
/ 02 мая 2010

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

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

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

0 голосов
/ 02 мая 2010

Вместо того, чтобы код 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...