需要在Python中持续监控串口数据
现在我正在使用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 个回答
假设你在使用 pySerial 这个库,serial.read()
这个命令只能读取一个字节的数据,也就是说它最多能读取到255这个值。如果你的Arduino发送的是字符串,最好在字符串之间加上换行符,然后使用 serial.readline()
来读取。
除非你有特别的性能要求,否则从Arduino发送字符串会让调试变得简单很多。
另外,如果你从Arduino接收到字符串,检查的方式应该是 if int(value) > 400:
与其让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
如果你使用的 serial
包是 pySerial,那么你需要注意 Serial.read()
方法 的定义:
read(size=1)
参数:size – 要读取的字节数。
返回值:从端口读取的字节。
从串口读取指定数量的字节。如果设置了超时,可能会返回少于请求的字符。如果没有设置超时,它会一直等待,直到读取到请求的字节数。
在2.5版本中更改:当可用时返回 bytes 的实例(Python 2.6及更新版本),否则返回 str。
虽然你在处理 byte
对象,但根据你的Python版本,你可能在处理 str
或 bytes
(数组)对象。这些对象不一定对应于整数值。
即使从 read()
接收到 byte
对象,最大的无符号整数也只有255。将 value
和400进行比较是没有意义的。你可以通过简单的调试输出找出返回对象的类型。
print type(value)
如果你需要处理 str
对象,可以查看如何使用 ord()
进行转换。
(提到的 flush
建议是针对原始问题的,该问题使用了 print
,而不是 tkinter
)。
查看 如何刷新Python打印的输出,并尝试使用命令行终端,而不是可能影响输出缓冲的IDE。