Пересылка массивов байт через последовательные порты DUE и MKRZero

Xboct
Offline
Зарегистрирован: 12.02.2020

Добрый всем ( день, ночь, утр, вечер )

Не могу понять ошибу. Дано есть две  Arduinы , DUE и MKRZero. Предполагается между ними пересылать данные в обе стороны. С DUE в MKR числа с данными для сетпоинтов и исполнительные команды, спрятанные в байт, обратно результаты исполнения команд и вычислений.

Соеденены между собой через серийные порты DUE(Serial3) и MKRZero(Serial1). Для проверки как принял данные смотрю их на компутерных COMах ( Serial у обоих Arduin ). Проблема в том, что содержимое байтов принимается нормально ( пробовал даже на 1 МБите между контроллерами ) , но вот их порядок скачет. Так как даже на больших скоростях внутренность байта правильная, то я думаю, что это не аппаратная проблема ( нестабильность частоты, недостаточный уровень или ещё что-то ) . Может местные знатоки подскажут где искать ошибку ?

для DUE :

[code]
byte D = 0x11 ;
byte T = 0xAA ;
byte C = 0x4C ;

byte ResD = 0x00 ;
byte ResT = 0x00 ;
byte ResC = 0x00 ;

void setup() { 
Serial.begin(115200);
Serial3.begin(9600);
}
void loop() {
Serial.println(ResD);
Serial.println(ResT);
Serial.println(ResC);
Serial.println("---------");

byte toMKR[] {D,T,C};
Serial3.write(toMKR,3);

if (Serial3.available() >2 ) {
      ResD = Serial3.read();
      ResT = Serial3.read();
      ResC = Serial3.read();}

}
[/code]

Для MKRZero :

[code]
byte Dm = 0x00 ;
byte Tm = 0x00 ;
byte Cm = 0x00 ;
 
byte ResD = 0x11 ;
byte ResT = 0x22 ;
byte ResC = 0x33 ;
 
void setup() {
  
Serial.begin(57600);
Serial1.begin(9600);
 
}
 
void loop() {
 
Serial.println(Dm);
Serial.println(Tm);
Serial.println(Cm);
Serial.println("---------");
 
 
byte toDUE[] {ResD,ResT,ResC};
Serial1.write(toDUE,3);
 
if (Serial1.available() >2 ) {
      Dm = Serial1.read();
      Tm = Serial1.read();
      Cm = Serial1.read();}
 
}
[/code]
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Во-первых, что такое "их порядок скачет"?

Во-вторых, что принимаете?

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

У вас их контроллер непрерывно в USART наваливает. Как на другом конце понять, какой из них первый по вашей задумке был? Количество совпало и ура

Xboct
Offline
Зарегистрирован: 12.02.2020

Порядок скачет - значения переменных правильные, но запсываются в разные переменнне, то в D, то в C то в T

Байты принимаются - я же проверяю принятое на cериалах связанных с компъютером. Принимаются правильно.... ну, разве что переводятся из шестнадцатеричной в десятичную систему. Это мне понятно почему.

Xboct
Offline
Зарегистрирован: 12.02.2020

Rumata пишет:

У вас их контроллер непрерывно в USART наваливает. Как на другом конце понять, какой из них первый по вашей задумке был? Количество совпало и ура

Один из байтов командный. Я заметил, что команды иногда не исполняются, когда добавил пересылку данных. Если посылать только командный байт команды исполняются хорошо.

Наваливает? Может подскажите как правильно? Какой-нибуть флаг начала-конца делать?

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

Xboct пишет:

 Какой-нибуть флаг начала-конца делать?

Как вариант

Xboct
Offline
Зарегистрирован: 12.02.2020

Я видел несколько скетчей, там всё только if (Serial.available()>x) , где x на 1 байт меньше чем количество принимаемых указано. У этих людей не "наваливает"? Хочется разобраться. 

Если надо флаг ловить, то это для меня труднее задача. Я ведь до программирования человек далёкий. :)

Можете лёгкий скэтч, как это легче и правильнее сделать? 

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

Xboct пишет:

Я ведь до программирования человек далёкий. :)

Так может и не стоит начинать? Тяги все равно нет к этому, зачем мучиться? 

b707
Offline
Зарегистрирован: 26.05.2017

Xboct пишет:

Можете лёгкий скэтч, как это легче и правильнее сделать? 

да там ничего сложного нет. Главное - для признака начала пакета подобрать такой уникальный байт. которого нигде больше не встретится. Если такой байт есть - то все просто. Приемник сидит и читает из порта все подряд, но все что принято - игнорируется, пока не придет магический байт. Следующий за ним - число байт в пакете, а далее остается только принять нужное число байт.

 

Xboct
Offline
Зарегистрирован: 12.02.2020

b707 пишет:

Xboct пишет:

Можете лёгкий скэтч, как это легче и правильнее сделать? 

да там ничего сложного нет. Главное - для признака начала пакета подобрать такой уникальный байт. которого нигде больше не встретится. Если такой байт есть - то все просто. Приемник сидит и читает из порта все подряд, но все что принято - игнорируется, пока не придет магический байт. Следующий за ним - число байт в пакете, а далее остается только принять нужное число байт.

 

Спасибо за подсказку

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Xboct пишет:

Порядок скачет - значения переменных правильные, но запсываются в разные переменнне, то в D, то в C то в T

Скорее всего, не "порядок скачет", а отсутствует синхронизация: вы по кругу отправляете переменные, но не следите, откуда начинать читать - и читаете, начиная с середины "кольца" (круга).

Цитата:

Байты принимаются - я же проверяю принятое на cериалах связанных с компъютером. Принимаются правильно.... ну, разве что переводятся из шестнадцатеричной в десятичную систему. Это мне понятно почему.

Ну, в десятичную систему Вы переводите сами println.

А вообще, существует такое понятие как "протокол" - специально, чтобы избежать потери или искажения информации. Можно передавать информацию пакетами с заголовком и контрольной суммой. Можно - как в протоколе MIDI - все команды имеют установленный старший бит, а данные - сброшенный. Тут масса самых различных вариантов.