Я особо ничего не передавал, но если честно - впервые слышу про «заголовки».
лучше не один, а два или три. Чтобы такая комбинация не встречалась в данных.
Хотя погодите…
Если у вас диапазоны 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;
}}
}
}
Фу таким быть!
Это кому? Мне?
[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 от Х
Логично.