Arduino的串行通信输出

Arduino的串行通信输出

问题描述:

我有2 Arduinos莱昂纳多,我希望他们给自己沟通,所以我做了下面的代码:Arduino的串行通信输出

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,反之亦然。问题是我没有收到我期待的东西。举例来说,如果I型test

Arduino的1:

Sent: test 

Arduino的2:

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

我还tryed做接收侧像发送侧和使用Serial.write但没有sucess 。 有没有更简单的方法来解决这个问题?

谢谢

汉斯提到,您需要一个协议。 这是我用考虑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'; 
} 

所以,基本上一条消息被视为只有当它是特殊字符> <之间,这样就完成。然后你可以在阅读时做同样的事情。

+0

这是返回我0。那应该是什么? – mafap 2013-05-12 19:26:51

+0

不是。您是否发送过像“123 FeliceM 2013-05-12 19:50:42

+0

是的,这返回123,但如果我发送任何字符,它返回0 – mafap 2013-05-12 20:02:05

如上所述,设备之间需要帧消息的协议。一个快速的方法是使用Bill Porter's EasyTransfer库,通过UART或I2C完成你正在做的事。它有几个例子。

+0

EasyTransfer对莱昂纳多的串行类型有问题,它给出编译错误:没有用于调用EasyTransfer :: begin(byte *,unsigned int,Serial_ *)的匹配函数' – 2013-08-18 09:32:55

+0

有EasyTransfer在Leonardo和Due上工作。如果你认为这个问题'回答',让我知道,我会发布代码。 – 2013-08-18 09:59:58