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

2024-05-28 09:37:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

该程序打算侦听串行等待命令“0;”。输入此命令时,Arduino读取温度传感器并将温度结果写入串行。在

从serial monitor可以正常工作,但是我不能使用pySerial与PYthon一起使用它。我觉得我在python实现中做了一些错误的事情,下面是代码片段: 编辑:如果我在调试模式下运行(在PyCharm上),下面的代码将按预期运行。我在这条线上给乞讨设置了一个断点:

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

从那里用“恢复程序”运行就可以了。我不知道为什么它不在“正常模式”下运行。在

^{pr2}$

以及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();


}

Tags: 代码命令self程序includeserialtemparduino
1条回答
网友
1楼 · 发布于 2024-05-28 09:37:51

它没有使用您的代码,但是为了实现相同的功能,我为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草图的更改将添加kSendTemperature到初始命令枚举:

^{pr2}$

替换send命令以二进制字符串形式发送浮点:

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

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

相关问题 更多 >