Пересылка массивов байт через последовательные порты DUE и MKRZero
- Войдите на сайт для отправки комментариев
Добрый всем ( день, ночь, утр, вечер )
Не могу понять ошибу. Дано есть две 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 :
Во-первых, что такое "их порядок скачет"?
Во-вторых, что принимаете?
У вас их контроллер непрерывно в USART наваливает. Как на другом конце понять, какой из них первый по вашей задумке был? Количество совпало и ура
Порядок скачет - значения переменных правильные, но запсываются в разные переменнне, то в D, то в C то в T
Байты принимаются - я же проверяю принятое на cериалах связанных с компъютером. Принимаются правильно.... ну, разве что переводятся из шестнадцатеричной в десятичную систему. Это мне понятно почему.
У вас их контроллер непрерывно в USART наваливает. Как на другом конце понять, какой из них первый по вашей задумке был? Количество совпало и ура
Один из байтов командный. Я заметил, что команды иногда не исполняются, когда добавил пересылку данных. Если посылать только командный байт команды исполняются хорошо.
Наваливает? Может подскажите как правильно? Какой-нибуть флаг начала-конца делать?
Какой-нибуть флаг начала-конца делать?
Как вариант
Я видел несколько скетчей, там всё только
if
(
Serial
.available()>x) , где x на 1 байт меньше чем количество принимаемых указано. У этих людей не "наваливает"? Хочется разобраться.
Если надо флаг ловить, то это для меня труднее задача. Я ведь до программирования человек далёкий. :)
Можете лёгкий скэтч, как это легче и правильнее сделать?
Я ведь до программирования человек далёкий. :)
Так может и не стоит начинать? Тяги все равно нет к этому, зачем мучиться?
Можете лёгкий скэтч, как это легче и правильнее сделать?
да там ничего сложного нет. Главное - для признака начала пакета подобрать такой уникальный байт. которого нигде больше не встретится. Если такой байт есть - то все просто. Приемник сидит и читает из порта все подряд, но все что принято - игнорируется, пока не придет магический байт. Следующий за ним - число байт в пакете, а далее остается только принять нужное число байт.
Можете лёгкий скэтч, как это легче и правильнее сделать?
да там ничего сложного нет. Главное - для признака начала пакета подобрать такой уникальный байт. которого нигде больше не встретится. Если такой байт есть - то все просто. Приемник сидит и читает из порта все подряд, но все что принято - игнорируется, пока не придет магический байт. Следующий за ним - число байт в пакете, а далее остается только принять нужное число байт.
Спасибо за подсказку
Порядок скачет - значения переменных правильные, но запсываются в разные переменнне, то в D, то в C то в T
Скорее всего, не "порядок скачет", а отсутствует синхронизация: вы по кругу отправляете переменные, но не следите, откуда начинать читать - и читаете, начиная с середины "кольца" (круга).
Байты принимаются - я же проверяю принятое на cериалах связанных с компъютером. Принимаются правильно.... ну, разве что переводятся из шестнадцатеричной в десятичную систему. Это мне понятно почему.
Ну, в десятичную систему Вы переводите сами println.
А вообще, существует такое понятие как "протокол" - специально, чтобы избежать потери или искажения информации. Можно передавать информацию пакетами с заголовком и контрольной суммой. Можно - как в протоколе MIDI - все команды имеют установленный старший бит, а данные - сброшенный. Тут масса самых различных вариантов.