Прямо сейчас я использую Ардуино для отправки данных от аналогового датчика до 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)
Если используемый вами пакет 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, которая может повлиять на буферизацию вывода.
Вместо того, чтобы код 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
Предполагая, что вы используете pySerial , serial.read ()
читает только один байт, что означает максимальное значение 255. Если ваш Arduino отправляет строковые значения обратно, вероятно, лучше всего разделить их символами новой строки и использовать serial.readline ()
.
Если у вас нет особых требований к производительности, отправка строк обратно из Arduino в любом случае значительно упростит отладку.
Также, если вы получаете строки обратно от Arduino, ваш тест должен быть , если int (value)> 400: