Официальный сайт компании Arduino по адресу arduino.cc
Нужна помощь с UART
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 18/02/2021 - 09:14
Доброго времени суток. Смыл затеи такой:
есть железка, которая в определенный момент времени начинает передавать данные в виде AA 00 00 00 00 00 C3 3C CB . Эти данные неизменны и передаются циклически до тех пор, пока эту железку не выключить. Как только появились эти данные ардуинка должна передавать этой железке данные типа 5A 01 22 29 27 10 01 3C до тех пор, пока железка не перестанет слать данные. Просто передачу данных с помощью Serial.write сделал, но хотелось бы, чтобы ардуинка слала данные, только когда пришли данные от железки. Как то так.
void setup(){ Serial.begin(9600); } void loop() { Serial.write(0x5A); Serial.write(0x01); Serial.write(0x22); Serial.write(0x29); Serial.write(0x27); Serial.write(0x10); Serial.write(0x01); Serial.write(0x3C); delay (100);
Ну дак а проблема то в чём? Принимай, сравнивай, отправляй.
Проблема в том, что я не знаю как это написать.
1. Научись принимать. Gугал, "Ардуино приём по Serial"
И немедленно принял.)
Как обычно, ищешь в принятых данных байт соответствующий началу пакета, вычитываешь нужное количество байт в массив. Сравниваешь полученные с эталоном, при совпадении отсылаешь свой пакет.
Если на это мозгов не хватает....
Тогда два варианта:
1. Читаешь тут темы по работе с uart
2.заказываешь в "ищу исполнителя"
исчерпывающие ответы
Ты траншеи копать умеешь? Давай меняца, ты мне траншею, я тебе красивый код.
исчерпывающие ответы
Ответы действительно исчерпывающие.
А если Вашей квалификации не хватает, чтобы суметь ими воспользоваться, то в сообщении №5 было предложено два варианта решения.
Я умею людей лечить, а не траншеи копать.
Я умею людей лечить, а не траншеи копать.
тогда ты оценил, как тебя тут "полечили".
На самом деле, обижаться не надо. Если даже ответ от Кактуса (#5)непонятен - то ничего другого, как повышать свой уровень - тут посоветовать нельзя.
Я умею людей лечить, а не траншеи копать.
А я вот людей лечить не умею, поэтому и не пытаюсь.
Я умею людей лечить, а не траншеи копать.
тогда ты оценил, как тебя тут "полечили".
На самом деле, обижаться не надо. Если даже ответ от Кактуса (#5)непонятен - то ничего другого, как повышать свой уровень - тут посоветовать нельзя.
Минус для Kakmyc поставил я. Посчитал, что способ решения просто не верен.
Ну так разверните оценку.
Минус для Kakmyc поставил я. Посчитал, что способ решения просто не верен.
Даже вот интересно, что именно не понравилось в этом примерном описании алгоритма приема и проверки пакета ?
Посчитал, что способ решения просто не верен.
расскажете?
Минус для Kakmyc поставил я. Посчитал, что способ решения просто не верен.
Как обычно, ищешь в принятых данных байт соответствующий началу пакета, вычитываешь нужное количество байт в массив. Сравниваешь полученные с эталоном,
Для случая AA AA AA AA AA ...... AA AA 00 00 00 00 00 C3
В том виде как написано, практическая реализация усложнена. Какое "нужное количество байт в массив", что делать когда не совпало и т.д. Поэтому и "Посчитал, что способ решения просто не верен."
(Изначально правда в моем комментарии было написано более категорично, наверное зря).
Если в префиксе пакета находятся данные эквивалентные тем, что содержаться в его теле, то задача нерешаема. Поэтому в префикс нормальные люди не суют что попало.
Когда не совпало, не отправлять пакет. Это явно следует из условия задачи.
Либо в пакете данных не должен попадаться префикс. Байт стаффинг называется.
Когда не совпало, не отправлять пакет. Это явно следует из условия задачи.
Я имел в виду, не совпало в массиве в котором ищем. Как сдвигать точку поиска, и т.д.
Реализуемо, но будет усложнено.
Никак не сдвигать. Начинать отсчёт только от префикса. До этого всё скипать.
Это стандартные процедуры для тех, кто пытается парсеры писать. Для других нужно было вообще объяснять с того, что такое "байт". Можешь сделать это, никто не запрещает.
Я чет не понял, автор же говорит что данные не изменяемые. Может проще ждать последний (СВ) и слать ответ. Или я не так понял?
Я умею людей лечить, а не траншеи копать.
А Вы можете дать консультацию - как делать лобэктомию?
Подозрительные строчки
согласен , поправил
В том случае, если сообщения не было более 500ms, после первого же байта произойдет сброс по таймауту. И на следующем пакете тоже. И т.д.
Sadman, специально проверил - нет такого проявления. Объясни, с чего так должно произойти.
А, сорян, скобку в конце 21 строки не приметил. Сейчас в IDE переформатировал - все скобки разбежались "по этажам". Вчера с телефона показалось, что prevRESET=millis(); выполняется только при "
if
(j ==
sizeof
(INmessage))
".(Не по поводу таймера)
Некоторые рассуждения - замечания. Если в процессе приема байтов после стартового AA (т.е. J>0) придет не ожидаемый байт, то он просто отбрасывается. Т.е. если вместо ожидаемого (например 00) пришел стартовый , то он отбросится.
(Изменено были ошибочные выводы).
Почему отбрасывается? весь пакет сбрасывается и скетч начинает ждать опять начальный байт ААh.
А в случае битых пакетов в общем то сброс по таймаутуи и поможет. Можно таймаут поменьше сделать, чтоб надежнее защищал
исчерпывающие ответы
А Вы каких ожидали? Можете привести "шаблон" ответа, который бы Вас устроил? Приведите, а мы подумаем.
Я умею людей лечить
Отлично! У меня что-то болит возле локтя. Скальпель и фонендоскоп у меня есть. И тонометр тоже валяется, только батарейку заменить надо. Как сделать, чтобы не болело? "Обратиться к врачу" и "идти в учиться в мед." не предлагать - это будут "исчерпывающие ответы".