我有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
但没有成功。
有没有更简单的方法来解决它?
由于
答案 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完成您正在尝试执行的操作。它有几个例子。