2012-03-01 3 views
1

Я пытаюсь отправить строку данных через последовательный порт с компьютера на плату Arduino Mega. Строка данных состоит из нескольких букв для идентификаторов и двух значений. Одно значение составляет от 0 до 240 (поэтому может быть двузначное значение или три раза), а второе значение - от -45 до + 45. Мне удалось написать код на C#, чтобы отправить строку, и это показано ниже.Отправка строки из C# через последовательный

private void goButton_Click(object sender, EventArgs e) 
    { 
     if (!serialPort1.IsOpen) 
      return; 
     command = 43; 
     outBuffer += "E" + command1 + "F"; 
     outBuffer += "G" + command2 + "H"; 
     // Therefore send through serial port a string in the following format: 
     // E<command1>FG<command2>H 
     // Where <command1> will be an int value between 0 - 240, and 
     // <command2> will be be a value between -45 and + 45 
     serialPort1.Write(outBuffer); 
     outBuffer = ""; 
    } 

Теперь у меня возникла проблема с извлечением значений из строки, когда она получена на плате Arduino. Я написал код, который, кажется, правильно отображает строку, но мне не удалось найти то, что я делаю неправильно, или как фактически фильтровать/извлекать два значения и хранить их в двух отдельных переменных. Код Arduino я в настоящее время является:

if (Serial.available() > 0) 
    { 
     char inData; 
     String inDataString; 
     inData = Serial.read(); 
     inDataString = inData; 
     // Shows the string of E<command1>FG<command2>H 
     Serial.print(inDataString); 
    } 

Как получить код на Arduino, чтобы быть правильным, так что я могу получить два значения, отправленные с компьютера?

ответ

0

Я не знаю Arduino, но вы могли бы сделать что-то вроде:

int start = inDataString.indexOf('E') 
int end = inDataString.indexOf('F') 
char str_char[end - start]; 
inDataString.substring(start, end).toCharArray(str_char, sizeof(str_char)); 
int my_integer_data = atoi(str_char); 
0

При отправке строки вы можете добавить возврат каретки/перевод строки после каждой команды. Как:

outBuffer = string.Format("E{1}F{0}G{2}H{0}", Environment.NewLine, command1, command2); 

После прочтения его, то вы знаете, что каждая команда существует на отдельной строке, так что вы можете разделить его:

string[] commands = inDataString.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
0

Один простой способ сделать такую ​​вещь на Arduino заключается в использовании библиотеки TextFinder (http://www.arduino.cc/playground/Code/TextFinder). Например:

#include <TextFinder.h> 

TextFinder finder(Serial); 

void setup() 
{ 
    Serial.begin(9600); 
} 

void loop() 
{ 
    finder.find("E"); 
    long command1 = finder.getValue(); 
    finder.find("FG"); 
    long command2 = finder.getValue(); 
    finder.find("H"); 

    // Do something with command1 and command 2 
} 
Смежные вопросы