需要不断监视Python中的串行数据

时间:2010-05-02 07:53:56

标签: python serial-port

现在我正在使用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 :(得分:3)

如果您使用的serial包是pySerial,请注意Serial.read() method的定义:

  

read(size=1)

     

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

     

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

     

从串口读取大小字节。如果设置了超时,则可能会根据请求返回较少的字符。没有超时,它将阻塞,直到读取所请求的字节数。

     

在版本2.5中更改:返回 bytes 的实例(如果可用(Python 2.6和更高版本))和 str

虽然您正在尝试处理byte个对象,但您可以(根据Python版本)处理strbytes(数组)对象。这些对象不一定对应于整数值。

即使从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)

假设您正在使用pySerialserial.read()只读取一个字节,这意味着最大值为255.如果您的Arduino正在发送字符串值,则最好用换行符分隔它们使用serial.readline()

除非你有特定的性能要求,否则从Arduino发回字符串将使调试变得更加容易。

此外,如果您从Arduino收回字符串,则您的测试应为if int(value) > 400: