我实现了一个简单的CmdMessenger示例,允许Arduino通过串口与PC通信。
程序意图听取串口等待命令' 0;'。输入此命令后,Arduino读取温度传感器并将温度结果写入串行。
它在串行监视器上工作正常,但是我不能在使用pySerial的PYthon中使用它。我想我在python实现中做错了,下面是代码片段: EDiTED:如果我在调试模式下运行(在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();
}
答案 0 :(得分:3)
它没有使用你的代码,但为了实现相同的功能,我已经为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
添加到初始命令枚举中:
enum {
kReadTemperature,
kSendTemperature,
kStatus,
};
替换你的send命令,使它将float作为二进制字符串发送:
//cmdMessenger.sendCmd(kStatus, (float) temp);
cmdMessenger.sendBinCmd(kSendTemperature, (float) temp);
并删除额外的Serial.Println(XXX)
命令。