Arduino串行通信输出

时间:2013-05-12 06:33:58

标签: serial-port arduino communication output

我有2个Arduinos Leonardo,我希望他们自己沟通,所以我做了以下代码:

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

void loop() {
  String outMessage = "";               // String to hold input

  while (Serial.available() > 0) {      // check if at least 1 char is available
    char inChar = Serial.read();
    outMessage.concat(inChar);          // add inChar to outMessage
  }

  if (outMessage != "") {
    Serial.println("Sent:  " + outMessage); // View Arduino 1 in Serial Monitor 1
    Serial1.print(outMessage);          // Send to Arduino 2
  }

  while (Serial1.available() > 0) {
    Serial.print("Received:  ");        // View Arduino 1 in Serial Monitor 2
    Serial.print(Serial1.read());       // Received from  Arduino 1
    Serial.println();
  }
}

我想从Arduino 1发送消息,在串行监视器中打印并通过TX1发送到Arduino 2,反之亦然。问题是我没有收到我期待的东西。例如,如果我输入test

Arduino 1:

Sent: test

Arduino 2:

Received: t
Received: e
Received: s
Received: t

我也尝试像发送方那样接收端并使用Serial.write但没有成功。 有没有更简单的方法来解决它?

由于

3 个答案:

答案 0 :(得分:1)

汉斯提到过,你需要一个协议。 这就是我用来将Arduino中的消息视为一个完整的消息:

char inData[10];
int index;
boolean started = false;
boolean ended = false;
String message =("I am Arduino 1 and I am ready");

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

void loop()
{
while(Serial.available() > 0)
{
char aChar = Serial.read();
if(aChar == '>')
{
  started = true;
  index = 0;
  inData[index] = '\0';
}
else if(aChar == '<')
{
  ended = true;
}
else if(started)
{
  inData[index] = aChar;
  index++;
  inData[index] = '\0';
}
}
if(started && ended)
{
int inInt = atoi(inData);

Serial.println(inInt);
}


// Get ready for the next time
started = false;
ended = false;

index = 0;
inData[index] = '\0';
}  

因此,基本上只有当消息介于特殊字符&gt;&lt;之间时才会认为消息已完成,如下所示:&gt; message&lt;。然后你可以在阅读时做同样的事情。

答案 1 :(得分:1)

它不必太复杂。如果您仔细查看最后一个 whlie 循环,您会发现软件每次通过循环时都没有机会读取多个字符。所以这就是你得到的:一次一个字符。

在你的第一个 while 循环中你做得更好:你收集了所有传入的信件,直到没有可用的信件,然后一次性发送它们。所以如果你让最后一个循环看起来更像第一个循环,你会得到更好的结果。

答案 2 :(得分:0)

如上所述,设备之间需要用于帧消息的协议。快速执行此操作的方法是使用Bill Porter's EasyTransfer库,它可以通过UART或I2C完成您正在尝试执行的操作。它有几个例子。