两个UNO跟一个MEGA通信 老是连出两个第一个板的数据
我用mega读取两个UNO的数据 板子之间是serial通信 数据是正常的 就是每隔几秒就连出两个第一个板子的数据 怎么解决呢~? 什麼資料也沒有, 能夠幫到你的, 相信只有 神 了. Super169 发表于 2014-8-8 17:12 static/image/common/back.gif什麼資料也沒有, 能夠幫到你的, 相信只有 神 了.
:'(我不知道要上传什么 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;
}
}
}
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:18 编辑
SerialEvent 是先處理 Serial1 再處理 Serial2 的, 只停頓 30 秒就發送, 不知處理速度上是否可行.亦有可能第一次資料未處理好, 就收到新的資料.
先減慢發送資料的頻率, 看看是否因為資料太多, 而做成遺失.
例如先改成 delay(1000), 每秒發送一次, 如沒問題就漸漸加密, 看看是否會因為太頻密而應付不了.
另一個方法去修改接收的程序, 每次只接收一個訊息.
while (Serial1.available())
改成
while (!stringComplete1&& Serial1.available())
當 Serial1 完成一次接收, 就去處理 Serial2 的資料.但這方法也有可能會因為傳送資料太頻密處理不及而 buffer overflow.
/.... 每隔几秒就连出两个第一个板子的数据 ..../
顯示的那個重覆是重覆了三個,其它的都一樣嗎?有重覆性嗎?能觀察更多的出錯情況,會更有利於分析問題。
Super169 发表于 2014-8-8 22:16 static/image/common/back.gif
SerialEvent 是先處理 Serial1 再處理 Serial2 的, 只停頓 30 秒就發送, 不知處理速度上是否可行.亦有可能 ...
谢谢 我试一下 eddiewwm 发表于 2014-8-9 17:24 static/image/common/back.gif
/.... 每隔几秒就连出两个第一个板子的数据 ..../
顯示的那個重覆是重覆了三個,其它的都一樣嗎?有重覆 ...
谢谢~是重复了两个 出错是有一定频率的 每隔同样的时间出一个这种错误数据 chd77903499 发表于 2014-8-11 09:16 static/image/common/back.gif
谢谢~是重复了两个 出错是有一定频率的 每隔同样的时间出一个这种错误数据
這樣可先判斷是MEGA的發送有問題,還是UNO的接收有問題。估計是MEGA那邊出錯機會大一點。
页:
[1]