SCmd.readSerial()和Serial.read()

时间:2018-05-02 07:06:07

标签: python arduino

目前我正在尝试通过串口将信息从python发送到Arduino。

我只使用一个字母Serial.read()'P'管理它,并使用以下代码在我的Arduino上执行操作。

Arduino代码:

#define arduinoLED 12   // Arduino LED on board

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(arduinoLED, OUTPUT);     // Configure the onboard LED for output
  digitalWrite(arduinoLED, LOW);   // default to LED off
 }

void loop() {
// put your main code here, to run repeatedly:
//delay (20000);
//char comein=Serial.read();
//Serial.println(comein);
char *arg = "hello";
if (Serial.read()== 'P'){


digitalWrite(arduinoLED, HIGH);
delay(5000);
}
else {
digitalWrite(arduinoLED, LOW);
Serial.println("Hello World");
}
}

Python代码:

ser.open()
ser.is_open

my_string='P'
my_string_as_bytes=str.encode(my_string)
print(my_string_as_bytes)
ser.write(my_string_as_bytes)

这很好用并打开我的LED但我怎么能管理多于一个字母的命令,例如'P1 2018'让led打开?

但我真正的问题是我尝试使用相同的Python代码做同样的事情,但使用SCmd.readSerial()来读取Arduino中的信息,如下所示:

Arduino代码:

 #include <SerialCommand.h>

 #define arduinoLED 12   // Arduino LED on board

 SerialCommand SCmd;   // The demo SerialCommand object

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(arduinoLED, OUTPUT);     // Configure the onboard LED for output
  digitalWrite(arduinoLED, LOW);   // default to LED off


  SCmd.addCommand("P1", process_command1); // Converts two arguments to integers and echos them back
  SCmd.addCommand("P", relay1_on);       // Turns Relay1 on
  SCmd.addDefaultHandler(unrecognized);  // Handler for command that isn't matched  (says "What?")
  Serial.println("Ready");
  }

  void loop() {
  // put your main code here, to run repeatedly:

  SCmd.readSerial();     // We don't do much, just process serial commands


 }

 void relay1_on()
{
  digitalWrite(12, HIGH);
  Serial.println(3000);
  delay(3000);
  digitalWrite(12, LOW);
 }

void process_command1()
{
  int aNumber = 5;
  char *arg = "hello";

  Serial.println("We're in process_command");
  arg = SCmd.next();
  int OhmPosition = atoi(arg); //will return only numbers
  arg = SCmd.next();
  int relay = atoi(arg); //will return only numbers
  arg = SCmd.next();
  int opentime = atoi(arg); //will return only numbers

  Serial.println(OhmPosition);
  Serial.println(relay);
  Serial.println(opentime);
  }

正如你所看到的,它们是串行命令,响应'P',这是与上面相同的例子,但由于某种原因它不起作用,不明白为什么。有什么想法吗?

第二个Serial命令是'P1',这是我想在最后得到的地方,所以我可以从Python发送类似的东西:

Python代码:

my_string6 = 'P1'+str(actions_time_[0][0] )+' '+str(actions_time_[0][1])+' '+str(actions_time_[0][2]))
my_string_as_bytes=str.encode(my_string6)
print(my_string_as_bytes)
ser.write(my_string_as_bytes)
output looks like this=> b'P1 150.0 5.0 2000.0 '

让我启动P1命令并发送值,保存在OhmPosition,Relay,Time中,用空格分隔,因为目标是驾驶一个小型电气自动装置。

我非常高兴能得到你们对这对夫妻的支持。

1 个答案:

答案 0 :(得分:0)

你的程序如何区分接收&#34; P1&#34;命令并接收&#34; P&#34;命令后跟一些随机的&#34; 1&#34;

您的代码似乎依赖于不是Arduino安装的标准部分的库。您应该提供指向SerialCommand类所在位置的链接。