现在我正在使用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)
答案 0 :(得分:3)
如果您使用的serial
包是pySerial,请注意Serial.read()
method的定义:
read(size=1)
参数: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,并尝试命令行shell,而不是可能影响输出缓冲的IDE。
答案 1 :(得分:0)
不是让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
答案 2 :(得分:0)
假设您正在使用pySerial,serial.read()
只读取一个字节,这意味着最大值为255.如果您的Arduino正在发送字符串值,则最好用换行符分隔它们使用serial.readline()
。
除非你有特定的性能要求,否则从Arduino发回字符串将使调试变得更加容易。
此外,如果您从Arduino收回字符串,则您的测试应为if int(value) > 400: