gpt4 book ai didi

python - 通过 CmdMessenger 与 Arduino 和 Python 通信,不起作用

转载 作者:行者123 更新时间:2023-11-30 23:06:01 25 4
gpt4 key购买 nike

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

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

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

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

并从那里运行“恢复程序”并且它可以工作。我不知道为什么它不能在“正常模式”下运行。

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 python 接口(interface) ( https://github.com/harmsm/PyCmdMessenger )。您可以通过以下方式使用它来完成此任务:

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 到您的初始命令枚举中:

enum {
kReadTemperature,
kSendTemperature,
kStatus,
};

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

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

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

关于python - 通过 CmdMessenger 与 Arduino 和 Python 通信,不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32879651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com