Обшение 2-x Ардуинок по uart
- Войдите на сайт для отправки комментариев
Втр, 08/01/2019 - 14:25
Доброго времени суток,прошу сильно не пинать,просто похожих тем ненашол,стала задача в передаче масива с одной ардуинки на другую и обратно,решил масив (int) перевести в масив byte и передавать побайтово,но чтото пошло нетак.... приемник выдает попеременно какийто плаваюшие значения т.е они меняются,использую 2 Uno,на одной передаю в софтварный uart,люди добрые пожалуста подскажите что я нетак делаю?
передатчик
#include <SoftwareSerial.h>
SoftwareSerial softSerial(8, 9);
byte buf[]{235,210,160,55,26};
void setup()
{
softSerial.begin(9600);
}
void loop(){
softSerial.write(0xff);
for (int i=0; i < sizeof(buf); i++)
{
softSerial.write(buf[i]);
}
}
приемник
byte buf[4];
void setup(){
Serial.begin(9600);
}
void loop() {
if (Serial.available()>sizeof(buf))
{
byte x = Serial.read();
if (0xff == x)
{
for (int i =0; i < sizeof(buf); i++)
{
x = Serial.read();
buf[i] = x;
}
}
}
Откуда это следует? Не вижу печати принятых значений в приёмнике.
Для начала, ничего, что Вы передаёте 6 байтов, а примнимаете 5? Это не всё, но давайте с этого начнём.
Строка 11 что делает?
Для начала в передатчик паузу добавте, в лооп, а то он строчит в буфер отправки без перерыву, тот переполняется и.. Последовательный порт вощето медленная штука. Ну и в стр.8 приемника наверно
sizeof(buf)+1, а то еще в стр.10 прием есть.Строка 11 что делает?
Это ожидание, типа, маркера начала передачи массива.
Для начала в передатчик паузу добавте, в лооп, а то он строчит в буфер отправки без перерыву, тот переполняется и..
А разве
вызовsoftSerial.writeне блокирующий?Строка 11 что делает?
Это ожидание, типа, маркера начала передачи массива.
А... Что-то я в передатчике его проглядел.
приемник выдает попеременно какийто плаваюшие значения т.е они меняются,использую 2 Uno,на одной передаю в софтварный uart,люди добрые пожалуста подскажите что я нетак делаю?
Ну , за исключением того, что передаете пять, а принимаете 4 байта массива, все выглядит нормально. Первые четыре байта должны совпадать. Но из приведенного скетча непонятно - как вы контролируете, что именно получено. Не через сериал монитор часом?
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); byte buf[5]; void setup(){ display.begin(SSD1306_SWITCHCAPVCC); display.cp437(true); Serial.begin(9600); } void loop() { if (Serial.available()>sizeof(buf)) { byte x = Serial.read(); if (0xff == x) { for (int i =0; i < sizeof(buf); i++) { x = Serial.read(); buf[i] = x; } } } display.clearDisplay(); display.setTextColor(WHITE); display.setCursor(0,0); display.setTextSize(1); display.println(buf[0]); display.println(buf[1]); display.println(buf[2]); display.println(buf[3]); display.println(buf[4]); display.println(buf[5]); display.display(); }