Всем привет! Прошу помощи. Соединил две 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());
}
}
Проверил, в коде передатчика ошибка в строке 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&)’
Во-первых, избегайте использования функций сериал, “помогающих” вам прочитать более одного байта - readBytes() , readString() и тп
Правильно использовать только read(), читать по байту и самому складывать из них все что нужно.
Во-вторых, при передаче более чем одного байта возникает проблема поиска начала и конца пакета. Поэтому у структуры @BOOM не хватает заголовка.
Соответственно и при приеме сначала надо найти заголовок в принимаемых данных, а потом уже сами данные