Отправка строки из C # через серийный номер - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь отправить строку данных через последовательный порт с компьютера на плату Arduino Mega .Строка данных состоит из нескольких букв для идентификаторов и двух значений.Одно значение находится в диапазоне от 0 до 240 (поэтому может быть двухзначным или трехзначным), а второе - числом от -45 до + 45. Мне удалось написать код на 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, чтобы я мог получить два значения, отправленные с компьютера?

Ответы [ 3 ]

0 голосов
/ 01 марта 2012

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

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 голосов
/ 02 марта 2012

Один из простых способов сделать это на 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
}
0 голосов
/ 01 марта 2012

Я не знаю 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...