通过 CmdMessenger 与 Arduino 和 Python 通信,不工作

Communicating with Arduino and Python via CmdMessenger, not working

我实现了一个简单的 CmdMessenger 示例,允许 Arduino 通过串行端口与 PC 通信。

程序意图侦听串行等待命令“0;”。键入此命令时,Arduino 读取温度传感器并将温度结果写入串口。

它在串行监视器上工作正常,但我无法使用 pySerial 将它与 PYthon 一起使用。我认为我在 python 实现中做错了什么,下面是代码片段: 已编辑:如果我在调试模式下 运行(在 PyCharm 上),则 运行s 以下的代码符合预期。我在这一行的开头设置了一个断点:

    if (not self.serialConnection.isOpen()): ...

和 运行 与 'Resume Program' 从那里开始工作。我不知道为什么它在 'Normal Mode'.

中没有 运行
import serial
import time

class Temperature:
    def __init__(self, comPath='/dev/ttyACM0', bauds=115200):
        self.serialConnection = serial.Serial(comPath, bauds, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_TWO,
                                              bytesize=serial.SEVENBITS)

    def queryTemperature(self):
        if (not self.serialConnection.isOpen()):
            self.serialConnection.open()

        # prints True:
        print self.serialConnection.isOpen()
        self.serialConnection.write("0;\n")
        time.sleep(2)
        while self.serialConnection.inWaiting() == 0:
            pass
        # don't reach this point. It stops on loop above
        time.sleep(2)
        iw = self.serialConnection.inWaiting()
        temp = (self.serialConnection.read(iw))
        self.serialConnection.close()
        return temp

以及方法queryTemperature的调用:

from temp_read import *
dObject = Temperature('COM3')
print dObject.queryTemperature();

程序没有完成。好像停在了循环中:

        while self.serialConnection.inWaiting() == 0:
            pass

下面是arduino草图:

#include <CmdMessenger.h>
#include <OneWire.h>
#include <DallasTemperature.h>

int pinTemp = 13;

CmdMessenger cmdMessenger = CmdMessenger (Serial);
OneWire oneWire (pinTemp);
DallasTemperature sensors (&oneWire);


enum {
  kReadTemperature,  
  kStatus,
};

void attachCommandCallbacks (){
  cmdMessenger.attach (onUnknownCommand);
  cmdMessenger.attach (kReadTemperature, onReadTemperature);  
}

void onStatus (){
  Serial.println ("status");

}

void onUnknownCommand (){
  Serial.println ("unknow");
}

void onReadTemperature (){
  Serial.println ("readTemp");
  sensors.requestTemperatures();
  delay (1500);
  float temp = sensors.getTempCByIndex(0);        
  cmdMessenger.sendCmd(kStatus, (float) temp);

}

void setup() {
 Serial.begin(115200); 
 sensors.begin ();
cmdMessenger.printLfCr(); 
  attachCommandCallbacks();


}

void loop() {
  cmdMessenger.feedinSerialData();


}

它没有使用您的代码,但为了实现相同的功能,我已经为 CmdMessenger (https://github.com/harmsm/PyCmdMessenger) 编写了一个强大的 python 接口。您可以通过以下方式使用它来完成此任务:

import PyCmdMessenger

# set up serial connection at proper baud rate
a = PyCmdMessenger.ArduinoBoard('/dev/ttyACM0',baud_rate=115200)

# list of commands at top of sketch, with argument formats
commands = [["kReadTemperature","f"],
            ["kSendTemperature","f"],
            ["kStatus","s"]]

cmd = PyCmdMessenger.CmdMessenger(a,commands)
cmd.send("kReadTemperature")
print(cmd.receive())

对您的 arduino sketch 的更改将 kSendTemperature 添加到您的初始命令枚举中:

enum {
      kReadTemperature,  
      kSendTemperature,
      kStatus,
};

替换您的发送命令,以便将浮点数作为二进制字符串发送:

//cmdMessenger.sendCmd(kStatus, (float) temp);
cmdMessenger.sendBinCmd(kSendTemperature, (float) temp);

并删除额外的 Serial.Println(XXX) 命令。