通过串口从C#发送字符串

时间:2012-03-01 17:27:00

标签: c# arduino

我正在尝试通过串行端口将一串数据从计算机发送到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 :(得分: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); 

答案 1 :(得分: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);

答案 2 :(得分: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
}