Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过CmdMessenger与Arduino和Python通信,但不起作用_Python_Arduino_Pyserial - Fatal编程技术网

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

通过CmdMessenger与Arduino和Python通信,但不起作用,python,arduino,pyserial,Python,Arduino,Pyserial,我实现了一个简单的CmdMessenger示例,允许Arduino通过串行端口与PC进行通信 该程序试图侦听正在等待命令“0;”的串行数据。键入此命令时,Arduino读取温度传感器并将温度结果写入串行 它在串行监视器中工作正常,但我无法使用pySerial将其与PYthon一起使用。我认为我在python实现中犯了一些错误,下面是代码片段: 编辑:如果我在调试模式下运行(在PyCharm上),下面的代码将按预期运行。我在这行的Begging处设置了一个断点: if (not self.

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

该程序试图侦听正在等待命令“0;”的串行数据。键入此命令时,Arduino读取温度传感器并将温度结果写入串行

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

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


}
#包括
#包括
#包括
int pinTemp=13;
CmdMessenger CmdMessenger=CmdMessenger(串行);
OneWire OneWire(pinTemp);
达拉斯温度传感器(单线);
枚举{
克雷德温,
克斯塔图斯,
};
void attachCommandCallbacks(){
cmdMessenger.attach(onUnknownCommand);
cmdMessenger.attach(kReadTemperature、onReadTemperature);
}
无效状态(){
Serial.println(“状态”);
}
void onunknown命令(){
Serial.println(“未知”);
}
无效温度(){
Serial.println(“readTemp”);
传感器。请求温度();
延迟(1500);
浮动温度=传感器。getTempCByIndex(0);
sendCmd(kStatus,(float)temp);
}
无效设置(){
序列号开始(115200);
sensors.begin();
cmdMessenger.printLfCr();
attachCommandCallbacks();
}
void循环(){
cmdMessenger.feedinSerialData();
}

它没有使用您的代码,但为了实现相同的功能,我为CmdMessenger()编写了一个健壮的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命令,使其将浮点作为二进制字符串发送:

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

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

我发现在等待中有些不可靠。。。也许加上睡眠而不是传球。。。。或者阅读,直到你们得到一些字符,表明结束的消息。。。我还发现,使用arduino,在打开串行连接后,它有助于睡眠几秒钟……此代码也不会打印任何内容:time.sleep(3)r=self.serialConnection.readline()print RYU不需要py2中的字节,因为字符串就足够了。。。请为换行符尝试“\n”而不是“\r”。。。尝试只读取单个字节而不是行。。。如果所有其他方法都失败,您可以在发送命令之前尝试打印命令,和/或设置免费串行端口监视器以监视串行端口通信