В порт прилетает массив, как принять и разобрать на переменные

mexme
Offline
Зарегистрирован: 18.10.2021

Добрый день! Написал прогу в андройд студио. Она по таймеру отправляет данные акселерометра (от -100 до 100 по двум осям). Отправка осуществляется массивом

 byte[] bytesToSend = { (byte)plane_y, (byte)plane_x };
 myThreadConnected.write(bytesToSend);

Сейчас не могу разобраться со стороной приема. Скетч сейчас такой. В мониторе порта выходит по две строчки с нужными числами. Как мне их правильно принимать и разложить в переменные, x и y например? (если я не ошибаюсь, то писать просто в  int неверно). С массивом что-то не выходит.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

int inbyte;

void setup() 
{
Serial.begin(9600); // Старт порта на скорости 
mySerial.begin(9600); // Старт виртуального порта 
}

void loop() {
 
if (mySerial.available())
{
inbyte = mySerial.read();
Serial.write(inbyte);
Serial.println(inbyte, DEC);
};
}

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Приходит два байта. Читаем их по очереди в int8_t plane_x и int8_t plane_y

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а синхронизируешь последовательность чем? как будешь отличать байты? нужно придумать протокол или взять готовый, к примеру в протоколе YAESU идет байт кода команды  и далее два байта данные

mexme
Offline
Зарегистрирован: 18.10.2021

В том и дело, что в этом пока не преуспел. У меня собственно летят координаты, поэтому я отправил два числа. Вот например Андройд не смешивает же, я в мониторе порта стабильно вижу две строчки.

Начитался много об этом в тырнете, но пока не разобрался. О парсинга порта, спецсимволах, чтение структуры и тп. Есть еще обда проблема, я указал, что все гуд, но разбираюсь еще.. Отрицательные числа вместо -1,-2,-3, превращаются в 243,244 и тп

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mexme пишет:

 Отрицательные числа вместо -1,-2,-3, превращаются в 243,244 и тп

тогда переменная должна быть не byte а int8_t

mexme
Offline
Зарегистрирован: 18.10.2021

дадада, действует уффф  пошли минуса)))

осталось в переменные распихать)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mexme пишет:

дадада, действует уффф  пошли минуса)))

осталось в переменные распихать)))

нужна преамбула, хотя бы один байт с нулевым значением к примеру, как начало блока данных

mexme
Offline
Зарегистрирован: 18.10.2021

понял, пока до преамбулы не добрался, пробую такой способ. Явно удается определить, что символов два приходит, а дальше не идет( пытаюсь x вывести. Реально таким способом? Может ошибок наляпал..

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

int8_t inbuf[2]; // буфер
int x, y; //для вывода переменных
int ksim = 0; //кол-во входящих символов


void setup() 
{
Serial.begin(9600); // Старт порта на скорости 
mySerial.begin(9600); // Старт виртуального порта 
}

void loop() {
for (int i=0; i<2; i++){
inbuf[i] = 0; 
ksim = mySerial.available();
delay(100);
if(ksim > 0){
  for(int i=1; i<=ksim; i++){
    inbuf[i] = mySerial.read();
   }
}
}    
x = inbuf[0];
y = inbuf[1];
Serial.println(inbuf [1], DEC);
}

 

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

Нереально. Softserial, delay... Ядерная смесь.