Обшение 2-x Ардуинок по uart

kskot
Offline
Зарегистрирован: 30.09.2018

Доброго времени суток,прошу сильно не пинать,просто похожих тем ненашол,стала задача в передаче масива с одной ардуинки на другую и обратно,решил масив (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;
    }
   }
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kskot пишет:
приемник выдает попеременно какийто плаваюшие значения т.е они меняются

Откуда это следует? Не вижу печати принятых значений в приёмнике.

Для начала, ничего, что Вы передаёте 6 байтов, а примнимаете 5? Это не всё, но давайте с этого начнём.

sadman41
Offline
Зарегистрирован: 19.10.2016

Строка 11 что делает?

Logik
Offline
Зарегистрирован: 05.08.2014

Для начала в передатчик паузу добавте, в лооп, а то он строчит в буфер отправки без перерыву, тот переполняется и.. Последовательный порт вощето медленная штука. Ну и в стр.8 приемника наверно sizeof(buf)+1, а то еще в стр.10 прием есть.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

Строка 11 что делает?

Это ожидание, типа,  маркера начала передачи массива.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Logik пишет:

Для начала в передатчик паузу добавте, в лооп, а то он строчит в буфер отправки без перерыву, тот переполняется и.. 

А разве  вызов softSerial.write не блокирующий?

sadman41
Offline
Зарегистрирован: 19.10.2016

asam пишет:

sadman41 пишет:

Строка 11 что делает?

Это ожидание, типа,  маркера начала передачи массива.

А... Что-то я в передатчике его проглядел.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

kskot пишет:

 приемник выдает попеременно какийто плаваюшие значения т.е они меняются,использую 2 Uno,на одной передаю в софтварный uart,люди добрые пожалуста подскажите что я нетак делаю?

Ну , за исключением того, что передаете пять, а принимаете 4 байта массива, все выглядит нормально. Первые четыре байта должны совпадать. Но из приведенного скетча непонятно - как вы контролируете, что именно получено. Не через сериал монитор часом?

kskot
Offline
Зарегистрирован: 30.09.2018
благодарю всем кто мпомог,нужно было просто в цикле поставить задержку,и все заработало 
Контролировал я что принемал выводя значения на олед дисплей,вот полный код приемника :-)
 
 
#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();
}