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

Всем привет! Прошу помощи. Соединил две UNO по последовательному порту, с одного контроллера передаю значения с потенциометров (каждый отвечает за свою ось координат) в виде “…Х|”, “…Y|”, второй контроллер получает данные, в которых находит символы Х и Y и присваивает значения координатам фигуры и отображает ее на дисплее ssd1306. Программа не работает, понимаю что связано с данными uint8_t.
Если отправлять например, как mySerial.write(“128X|”) или mySerial.write(“128Y|”) все отлично работает, фигура перемещается. Подскажите как исправить ошибку при вставке переменной в функцию mySerial.write()?
Необходимо преобразовать строку в uint8_t? Спасибо всем!
Передатчик:

#include <SoftwareSerial.h>

int X = 0;
int Y = 0;
String XS = " ";
String YS = " ";

SoftwareSerial mySerial(3,2);

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

}

void loop() {
    X = map(analogRead(A0), 0, 1023, 0, 128);
    Y = map(analogRead(A1), 0, 1023, 0, 64);
    XS = String(X) + String("X|");
    YS = String(Y) + String("Y|");
    mySerial.write(XS);
    delay(100);
    mySerial.write(YS);
    delay(100);

}

Приёмник:

#include <SoftwareSerial.h>

int X = 0;
String Counter1 = " ";
int Y = 0;
String Counter2 = " ";

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

SoftwareSerial mySerial(3,2);

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

void loop() {
    if (mySerial.available() >= 1) {
      String R = mySerial.readStringUntil('|');
      if (R.indexOf('X') > -1) {
        X = R.indexOf('X');
        Counter1 = R.substring(0,X);
        X = Counter1.toInt();
        Serial.println(X);
      }
      if (R.indexOf('Y') > -1) {
        Y = R.indexOf('Y');
        Counter2 = R.substring(0,X);
        Y = Counter2.toInt();
        Serial.println(Y);
      }
          u8g.firstPage();
        do {
         u8g.drawRFrame(X, Y, 10, 10, 0);
        	  } while(u8g.nextPage());
    }

}

В строке №29 приёмника, очевидно должен быть Y, а не X.

А вообще, зачем Вы выбрали самый геморройный способ передачи? Просто передать структуру из двух чисел (не строки, а именно числа) никак нельзя?

1 лайк

А где там в коде uint8_t ???

Таки да…

Не проверял

Передатчик:


#include <SoftwareSerial.h>

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

SoftwareSerial mySerial(3,2);

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

void loop() {
  Point myPoint;
  myPoint.X = map(analogRead(A0), 0, 1023, 0, 128);
  myPoint.Y = map(analogRead(A1), 0, 1023, 0, 64);
  mySerial.write(myPoint);
}

Приёмник:

 #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());
  }
}

Ошибка, без переменной в аргументе функции программа


работает

Чо?

ЗЫ: Товарищи модераторы/администраторы. Задолбало уже ограничение на количество символов в сообщении!!! Зачем оно вообще нужно???!!!

2 лайка

Наверное потому, что для символов и строк существует метод print ? А вообще - я же код готовый дал, даже попробовать нет желания?))

Это бессмысленный набор слов, выражайтесь яснее.

А сообщения об ошибках надо вставлять текстом (копипастить), на Вашей картинке ни хрена не видно.

1 лайк

«… работает», это слово вниз опустилось (картинки вставляет тоже так себе).

Проверил, в коде передатчика ошибка в строке 18:
/Users/aleksandr/Downloads/Bluetooth/Bluetooth.ino: In function ‘void loop()’:
/Users/aleksandr/Downloads/Bluetooth/Bluetooth.ino:18:25: error: no matching function for call to ‘SoftwareSerial::write(Point&)’
mySerial.write(myPoint);
^
In file included from /Users/aleksandr/Downloads/Bluetooth/Bluetooth.ino:1:0:
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SoftwareSerial/src/SoftwareSerial.h:102:18: note: candidate: virtual size_t SoftwareSerial::write(uint8_t)
virtual size_t write(uint8_t byte);
^~~~~
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SoftwareSerial/src/SoftwareSerial.h:102:18: note: no known conversion for argument 1 from ‘Point’ to ‘uint8_t {aka unsigned char}’
In file included from /Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Stream.h:26:0,
from /Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/HardwareSerial.h:29,
from /Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Arduino.h:233,
from /private/var/folders/mz/bbf75ggs659_l_3llj2m13yw0000gn/T/arduino/sketches/0029C024FBF968D8FFCBF6C7B02B099B/sketch/Bluetooth.ino.cpp:1:
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Print.h:57:12: note: candidate: size_t Print::write(const char*, size_t)
size_t write(const char buffer, size_t size) {
^~~~~
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Print.h:57:12: note: candidate expects 2 arguments, 1 provided
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Print.h:56:20: note: candidate: virtual size_t Print::write(const uint8_t
, size_t)
virtual size_t write(const uint8_t buffer, size_t size);
^~~~~
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Print.h:56:20: note: candidate expects 2 arguments, 1 provided
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Print.h:52:12: note: candidate: size_t Print::write(const char
)
size_t write(const char str) {
^~~~~
/Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino/Print.h:52:12: note: no known conversion for argument 1 from ‘Point’ to 'const char

Несколько библиотек найдено для “SoftwareSerial.h”
Используется: /Users/aleksandr/Library/Arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SoftwareSerial
Не используется: /Users/aleksandr/Documents/Arduino/libraries/SoftwareSerial
exit status 1

Compilation error: no matching function for call to ‘SoftwareSerial::write(Point&)’

нда… действительно…

@BOOM

это что за фигня? :slight_smile:

Метод read() читает один байт, с чего он вдруг структуру читать станет?

Хм, ну отправить можно, думаю, так:

mySerial.write((byte*)&myPoint, sizeof(myPoint));

Надо с отправкой сначала разобраться))

мне всегда казалось что эти две вещи как-то связаны :slight_smile:

Это уже при отладке, а мы еще на стадии компиляции ))

Исправил, ошибок при компиляции нет. А что делать с приемом структуры?

Может быть при чтении использовать mySerial.readBytes(байтовый буфер, размер)?

Во-первых, избегайте использования функций сериал, “помогающих” вам прочитать более одного байта - readBytes() , readString() и тп
Правильно использовать только read(), читать по байту и самому складывать из них все что нужно.

Во-вторых, при передаче более чем одного байта возникает проблема поиска начала и конца пакета. Поэтому у структуры @BOOM не хватает заголовка.
Соответственно и при приеме сначала надо найти заголовок в принимаемых данных, а потом уже сами данные

Да, давай это и попробуем.

Заголовок это например стартовый байт?