需要在Python中持续监控串口数据

5 投票
3 回答
21375 浏览
提问于 2025-04-15 22:15

现在我正在使用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 个回答

0

假设你在使用 pySerial 这个库,serial.read() 这个命令只能读取一个字节的数据,也就是说它最多能读取到255这个值。如果你的Arduino发送的是字符串,最好在字符串之间加上换行符,然后使用 serial.readline() 来读取。

除非你有特别的性能要求,否则从Arduino发送字符串会让调试变得简单很多。

另外,如果你从Arduino接收到字符串,检查的方式应该是 if int(value) > 400:

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
3

如果你使用的 serial 包是 pySerial,那么你需要注意 Serial.read() 方法 的定义:

read(size=1)

参数:size – 要读取的字节数。

返回值:从端口读取的字节。

从串口读取指定数量的字节。如果设置了超时,可能会返回少于请求的字符。如果没有设置超时,它会一直等待,直到读取到请求的字节数。

在2.5版本中更改:当可用时返回 bytes 的实例(Python 2.6及更新版本),否则返回 str

虽然你在处理 byte 对象,但根据你的Python版本,你可能在处理 strbytes(数组)对象。这些对象不一定对应于整数值。

即使从 read() 接收到 byte 对象,最大的无符号整数也只有255。将 value 和400进行比较是没有意义的。你可以通过简单的调试输出找出返回对象的类型。

print type(value)

如果你需要处理 str 对象,可以查看如何使用 ord() 进行转换。

(提到的 flush 建议是针对原始问题的,该问题使用了 print,而不是 tkinter)。

查看 如何刷新Python打印的输出,并尝试使用命令行终端,而不是可能影响输出缓冲的IDE。

撰写回答