2

我有 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

阿杜诺1:

Sent: test

阿杜诺 2:

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

我也尝试像发送方一样做接收方并使用Serial.write但没有成功。有没有更简单的方法来做到这一点或修复它?

谢谢

4

3 回答 3

1

Hans 提到过,你需要一个协议。这就是我用来将 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';
}  

因此,基本上只有在特殊字符 >< 之间的消息才被视为已完成,例如:>message<。然后你可以在阅读时做同样的事情。

于 2013-05-12T14:01:54.407 回答
1

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

在您的第一个 while 循环中,您做得更好:您收集了所有传入的信件,直到没有可用的信件,然后一次全部发送。因此,如果您使最后一个循环看起来更像第一个循环,您将获得更好的结果。

于 2021-02-28T19:05:02.663 回答
0

如前所述,设备之间需要帧消息协议。一个快速的方法是使用Bill Porter 的 EasyTransfer库,它可以通过 UART 或 I2C 完成您想要做的事情。它有几个例子。

于 2013-05-13T13:48:54.620 回答