Передача данных между UNO по SoftSerial

Я особо ничего не передавал, но если честно - впервые слышу про «заголовки».

лучше не один, а два или три. Чтобы такая комбинация не встречалась в данных.

Хотя погодите…
Если у вас диапазоны X и Y оба меньше чем полный байт, как вот тут:

То можно использовать свободный старший бит для того чтобы различить X и Y. Тогда координаты можно передавать по отдельности, и никакие структуры, заголовки и прочие зауми не нужны

Вот вам передачтчик

#include <SoftwareSerial.h>

SoftwareSerial mySerial(3,2);

void setup() {
  mySerial.begin(9600);
}

void loop() {
 byte X = analogRead(A0) >> 3;
 mySerial.write(X);
  byte Y = (analogRead(A1) >> 4)  | 0x80;
 mySerial.write(Y);
  
}

А вот приемник

#include <SoftwareSerial.h>
#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE U8G_I2C_OPT_DEV_0);

SoftwareSerial mySerial(3,2);

void setup() {
 mySerial.begin(9600);
}

void loop() {
  static byte last_read = 0x80;
  static byte X =0;
  static byte Y = 0;
  if (mySerial.available()) {
    byte c = mySerial.read();
    if  (c & 0x80) { // приняли Y
     if ( ! (last_read & 0x80)) { // предыдущий принятый байт был Х
        Y = c;
        last_read = c;
        u8g.firstPage();
        do {
          u8g.drawRFrame(X,Y, 10, 10, 0);
          } while(u8g.nextPage());
     }
}
   else {
      if  (last_read & 0x80) { // предыдущий принятый байт был Y
         X = c;
        last_read = c;
   }}
}
}

Фу таким быть! :frowning:

Это кому? Мне?

[quote=“BOOM, post:4, topic:12248”]

#include <SoftwareSerial.h>
#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE U8G_I2C_OPT_DEV_0);

SoftwareSerial mySerial(3,2);

typedef struct {
  uint8_t X = 0;
  uint8_t Y = 0;
} Point;

void setup() {
//  Serial.begin(9600); // А это тут зачем???
  mySerial.begin(9600);
}

void loop() {
  Point myPoint;
  if (mySerial.available()) {
    myPoint = mySerial.read();
    u8g.firstPage();
    do {
      u8g.drawRFrame(myPoint.X, myPoint.Y, 10, 10, 0);
    } while(u8g.nextPage());
  }
}

[/quote]Получилось! добавил задержку передатчику и для контроля отправку данных в монитор порта приемника. Отлично! Нужные значения, но при этом на экране отсутствует изображение фигуры, может быть необходимо тип данных поменять при обращении к функции работы экрана?

Странно, судя по тому что выше обсуждали - не должно было работать )))

#include <SoftwareSerial.h>
 #include "U8glib.h"
  U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);

SoftwareSerial mySerial(3,2);

void setup() {
 mySerial.begin(9600);
 Serial.begin(9600);
}

void loop() {
  static byte last_read = 0x80;
  static byte X =0;
  static byte Y = 0;
  if (mySerial.available()) {
    byte c = mySerial.read();
    if  (c & 0x80) { // приняли Y
     if ( ! (last_read & 0x80)) { // предыдущий принятый байт был Х
        Y = c;
      
        last_read = c;

     }
}
   else {
      if  (last_read & 0x80) { // предыдущий принятый байт был Y
         X = c;
        last_read = c;
   }}
        Serial.println(Y);
        Serial.println("Y");
}
        u8g.firstPage();
      do {
       u8g.drawRFrame(X, Y-128, 10, 10, 0);
      	  } while(    u8g.nextPage()   );

    }

Все заработало!!! Потребовалось из Y 128. Отлично, спасибо всем кто подсказал

Заметил, что со временем приемник все с большей и большей задержкой принимает данные, а без задержки в 200 мс в передатчике вообще на экране нет отображения

что за фигня?

я так вижу

Сорри, это мой промах - забыл избавится от старшего бита, который добавляется чтобы отличить Y от Х

Логично.

1 лайк