我正在尝试通过串行端口将一串数据从计算机发送到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上的代码正确无误,以便我可以从计算机上获取两个值?
答案 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
}