chd77903499 发表于 2014-8-8 15:18:32

两个UNO跟一个MEGA通信 老是连出两个第一个板的数据

我用mega读取两个UNO的数据 板子之间是serial通信 数据是正常的 就是每隔几秒就连出两个第一个板子的数据 怎么解决呢~?

Super169 发表于 2014-8-8 17:12:24

什麼資料也沒有, 能夠幫到你的, 相信只有 神 了.

chd77903499 发表于 2014-8-8 18:17:32

Super169 发表于 2014-8-8 17:12 static/image/common/back.gif
什麼資料也沒有, 能夠幫到你的, 相信只有 神 了.

:'(我不知道要上传什么

chd77903499 发表于 2014-8-8 18:18:02

MEGA的代码/*
Serial Event example

When new serial data arrives, this sketch adds it to a String.
When a newline is received, the loop prints the string and
clears it.

A good test for this is to try it with a GPS receiver
that sends out NMEA 0183 sentences.

Created 9 May 2011
by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/SerialEvent

*/

String inputString1 = "";         // a string to hold incoming data
String inputString2 = "";         // a string to hold incoming data
boolean stringComplete1 = false;// whether the string is complete
boolean stringComplete2 = false;// whether the string is complete

void setup() {
// initialize serial:
Serial.begin(115200);
Serial1.begin(115200);
Serial2.begin(115200);
// reserve 200 bytes for the inputString:
inputString1.reserve(200);
inputString2.reserve(200);
}

void loop() {
// print the string when a newline arrives:
if (stringComplete1) {
    Serial.print(inputString1);
    // clear the string:
    inputString1 = "";
    stringComplete1 = false;
}
if (stringComplete2) {
    Serial.print(inputString2);
    Serial.print("\n");
    // clear the string:
    inputString2 = "";
    stringComplete2 = false;
}
}

/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX.This routine is run between each
time loop() runs, so using delay inside loop can delay
response.Multiple bytes of data may be available.
*/
void serialEvent1() {
while (Serial1.available()) {
    // get the new byte:
    char inChar1 = (char)Serial1.read();
    // add it to the inputString:
    if (inChar1 != '\n') {
    inputString1 += inChar1;
    }
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar1 == '\n') {
      stringComplete1 = true;
    }
}
}
void serialEvent2() {
while (Serial2.available()) {
    // get the new byte:
    char inChar2 = (char)Serial2.read();
    // add it to the inputString:
    inputString2 += inChar2;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar2 == '\n') {
      stringComplete2 = true;
    }
}
}

chd77903499 发表于 2014-8-8 18:19:24

UNO的代码
#include "Wire.h"

#include "I2Cdev.h"

#include "MPU6050.h"

MPU6050 accelgyro;


int16_t ax, ay, az;

int16_t gx, gy, gz;



bool blinkState = false;



void setup() {



    Wire.begin();

   
    Serial.begin(115200);

    accelgyro.initialize();
    accelgyro.setRate (0) ;         //sampling 1kHz
    //accelgyro.setDLPFMode ( 1 ) ;   //DLPF 100Hz delay 2ms
}

void loop() {



    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
   
    //Serial.print("a/g:\t");

    Serial.print(ax); Serial.print(",");

    Serial.print(ay); Serial.print(",");

    Serial.print(az); //Serial.print(",");
    Serial.print("\n");
   
    delay(30);

}

Super169 发表于 2014-8-8 22:16:01

本帖最后由 Super169 于 2014-8-8 22:18 编辑

SerialEvent 是先處理 Serial1 再處理 Serial2 的, 只停頓 30 秒就發送, 不知處理速度上是否可行.亦有可能第一次資料未處理好, 就收到新的資料.

先減慢發送資料的頻率, 看看是否因為資料太多, 而做成遺失.
例如先改成 delay(1000), 每秒發送一次, 如沒問題就漸漸加密, 看看是否會因為太頻密而應付不了.

另一個方法去修改接收的程序, 每次只接收一個訊息.

while (Serial1.available())

改成

while (!stringComplete1&& Serial1.available())

當 Serial1 完成一次接收, 就去處理 Serial2 的資料.但這方法也有可能會因為傳送資料太頻密處理不及而 buffer overflow.

eddiewwm 发表于 2014-8-9 17:24:38

/.... 每隔几秒就连出两个第一个板子的数据 ..../

顯示的那個重覆是重覆了三個,其它的都一樣嗎?有重覆性嗎?能觀察更多的出錯情況,會更有利於分析問題。

chd77903499 发表于 2014-8-11 09:15:26

Super169 发表于 2014-8-8 22:16 static/image/common/back.gif
SerialEvent 是先處理 Serial1 再處理 Serial2 的, 只停頓 30 秒就發送, 不知處理速度上是否可行.亦有可能 ...

谢谢 我试一下

chd77903499 发表于 2014-8-11 09:16:46

eddiewwm 发表于 2014-8-9 17:24 static/image/common/back.gif
/.... 每隔几秒就连出两个第一个板子的数据 ..../

顯示的那個重覆是重覆了三個,其它的都一樣嗎?有重覆 ...

谢谢~是重复了两个 出错是有一定频率的 每隔同样的时间出一个这种错误数据

eddiewwm 发表于 2014-8-12 20:59:57

chd77903499 发表于 2014-8-11 09:16 static/image/common/back.gif
谢谢~是重复了两个 出错是有一定频率的 每隔同样的时间出一个这种错误数据

這樣可先判斷是MEGA的發送有問題,還是UNO的接收有問題。估計是MEGA那邊出錯機會大一點。
页: [1]
查看完整版本: 两个UNO跟一个MEGA通信 老是连出两个第一个板的数据