Подскажите библиотеку для UART
- Войдите на сайт для отправки комментариев
Пт, 22/01/2021 - 08:07
Уважаемые форумчане, новичку требуется ваша помощь!
С ПК приходят такие команды строчкой для управления ШД:
MOVE Y (Y номер мотора, передвинуть на позицию заданную X)
SET X Y (Y номер мотора, X - позиция для этого мотора. Задаёт значения X для мотора Y)
MCAL Y (Y - номер мотора, двигает мотор до концевика и обнуляет X)
Вопрос: каким образом на принимающей ардуине можно принять эти строки и разбить на переменные?
p.s. это не грайвер и не 3D-принтер
В конце строчки есть перевод строки и каретки? Если используете аппаратный UART библиотека не требуется. А парсинг пишется ручками
Как писал выше, на ардуину может прийти две команды - MOVE Y и SET X Y
Где Y (1-3), а X(0-250). Как можно, желательно не создавая велосипедов, вынуть из пришедшей строки эти integer-ы ?
Методом около-научного тыка выяснил, что "Y" вообще ничего не отправляет, всё отправляется через "X"..
А где ответ на #1 ?
ага... где-где - в лоно Родины... там исчи.
Благодарю за помощь, сильно увлёкся вашим ответом
Возник вопрос касаемо вот этого фрагмента:
Принимается строка до пробела, если принятое "SILENT" то начинает считывать дальше уже в этом цикле.
Но, считывает в String, а нужно что бы символы в строке переводились в число и записывались в переменную Integer intZ. В данном примере работает и так, но тут всего два числа, а вот здесь:
X - принимает значение от 0 до 100, не делать же * if(X==47) * 100 раз для каждого возможного числа? X - это значение для STEP/DIR драйвера ШД, и оно должно извлекаться из String в Integer, но я никак не могу понять, как сделать это преобразование String to Integer
Чувствую себя сейчас очень тупым, но ещё летом с неделю потратил на то, что бы найти какое-то решение данной проблемы, но ничего тогда не нашёл, хотя всё решалось элементарно:
Ещё оптимальный использовать бинарный формат обмена, а не кодировать/парсить туда-сюда.
Можно подробнее в рамках моей задачи? Я смогу таким образом определять строки? Насколько это будет сложнее чем то, что уже сделано? Будет большая выгода по скорости исполнения кода?
Строки контроллеру вообще не нужны, он оперирует числами. Которые, в том числе, соответствуют образам букв, складывающимся в строки.
Будет ли сложнее для понимания? Возможно.
Будет ли более быстро? Да, но Вы этого не заметите.
Будет ли стабильней? Определённо да - в условиях малого объёма RAM оперировать цифрами с известной размерностью правильней, чем строками с неизвестной.
Сильно.. Спасибо! Сейчас буду сидеть, изучать ваш код
есть ещё такой вариант)) причесал типа
Спасибо, но я не силён в программировании, далее нужно так или иначе переделывать ваш код под себя, а я пока не владею теми элементами что вы использовали в своём коде. Поэтому принял решения дописать свой код из знакомых мне элементов.
Но я не понимаю одного момента:
После SET идёт X а за ним Y, но Y почему-то выводиться строго после проверки на условия, т.е. сначала пустая переменная Y проверяется на условия, а затем в неё парсятся данные из серийного порта, я не могу это объяснить, т.к. парсинг X и Y в моём коде одинаков.
Вот даже вставил Serial.print(Y); (если поставить Serial.println(Y); строка перенесётся на пустом месте после CH2 =) и ничего, парсит Y только после проверки на условия
Я не понимаю какой-то очевидной вещи, возможно даже в синтаксисе, но не могу понять какой именно..
Может мне кто-нибудь помочь?
Я тоже ничего не понял из объяснений, но сравните в последнем фрагменте строки 19 и 23 посимвольно. Это точно то, что вы хотели написать?
А что не понятно то? Я специально везде комменты вставил, а там где их нет это Serial.print и так понятно что он делает. Вместо Serial.print или после него вставляете нужные вам действия вот и вся переделка.
А ваш код хоть сколь нибудь нормально работать не будет если будете кучу while и delay использовать. Про String я молчу.
Да, я специально добавил " != " что бы проверить, что в переменной действительно ничего нет. Вопрос лишь в том, почему ардуина начинает считывать Y из серийного порта только после проверки условий, хотя в коде она идёт намного раньше
Понимаю, мой код далеко не самый оптимальный, но в целом он работает и то как он работает в целом меня устраивает. В данный момент всё упёрлось именно в этот злосчастный "Y" распознавание которого почему-то происходит после проверки его на условия..
Ну вам виднее. Я будучи новичком старался прислушиваться к советам старожил
имхо, как то две фразы противоречат друг другу. Вы уж определитесь.
ТС, добавил твоего Гивера, если уж и здесь не разберешься, то увольте... комментов больше чем кода
ПС. из терминала команды слать в соответствии с постом #0. Не забываем ставить перевод строки и каретки и скорость 115200
ТС, добавил твоего Гивера, если уж и здесь не разберешься, то увольте... комментов больше чем кода
Только код "кривой". (Он может и рабочий (не проверял), но "кривой").
Например переменная stringEnd присваивается в нескольких местах, и нигде не проверяется.
Осталась ли на свете хоть одна библиотека, которую гивер не засрал?
Сколько ардуиной пользовался, всегда только на костылях и выезжал. Примером своего кода вы открыли мне очень много дверей! Спасибо!!!)
А что с ним не так? В порт выводит всё как надо, правда мотор стоит, но я пока играюсь с только что освоенными функциями из его примера, думаю разберусь.
Как начнутся проблемы - идите на его форум, здесь понимания не найдете.
согласен, это забыл добавить. Скетч на коленке писался, не для себя же, также код не проверял в работе, нету у меня шаговиков. А на счет Гивера это не ко мне.
исправленный вариант
поправил, я в Гивере не разбирался, там в лупе добавил motor.tick(); наверное из этого не работал
а так жду более конструктивной критики
Они киииборги, они заполонили...
Даа! Благодарю, теперь всё работает!!!
Они киииборги, они заполонили...
последний пипец - они там пишут теперь не более не менее чем "свое ядро для СТМ32". Я спросил - накуа??? - ответ гениален: "Чтобы удобные библиотеки Алекса(в смысле Гайвера) портировать на более мощную платформу"
Ничего святого у людей...
Зачем им более мощная платформа, если с его либами ардуина работает как пентиум 4?
Да потому что пудрят мозги неокрепшему организму. Народ ведь хавает что это "самое быстрое", "самое самое", а нафига, заради чего - не понимает. Хотя не шарит и без этого.(
паматрел я код givertimers, ничего не изменилось
Тажело судить по этому фрагменту. Видно что выбирается максимум от (_timer0_cycles / _timer0_divider) и для 1 аналогично, и что?
А чего тут судить, если в uint8_t запихивается значение 256UL?
А чего тут судить, если в uint8_t запихивается значение 256UL?
Согласен. С наскоку не заметил.(