Разница между SCmd.readSerial () и Serial.read () - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я пытаюсь отправить информацию из 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)

Это хорошо работает и включает мой светодиод, но как я могу управлять более чем одной буквой для команды, например 'P1 2018' для включения светодиода?

Но моя настоящая проблема в том, что я пытаюсь сделать то же самое, используя тот же код 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, Реле, Время, которое будет разделено пробелом, так как цель состоит в том, чтобы запустить небольшой электрический автомат.

Буду очень рад, если вы поддержите эти пары точек, связанных друг с другом.

1 Ответ

0 голосов
/ 03 мая 2018

Как ваша программа может определить разницу между получением команды "P1" и получением команды "P", за которой следует произвольная "1"

Ваш код основан на библиотеке, которая не является стандартной частью установки Arduino. Вы должны предоставить ссылку на то, где вы получили класс SerialCommand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...