Вопрос по функции sscanf
- Войдите на сайт для отправки комментариев
Втр, 16/02/2021 - 23:23
Всем добрый вечер! просьба помочь в правильном написании значений для функции sscanf.
есть рабочий код для arduino для поворотной антенны. Координаты в ардуино поступают через USB- порт от программы WXtrack формата:
AZ255.7 EL1.0 UP0 DN0
с этим форматом arduino- код работает, функция так прописана:
sscanf(usb, "AZ%s EL%s\#13",&a, &b);
Я данную поворотку хочу подключить к программе ORBITRON, формат данных там немного другой:
AZ255.7 EL1.0
Вопрос: как правильно прописать параметры в sscanf, чтобы она понимала этот формат строк.
мsscanf(usb, "AZ%s EL%s\#13",&a, &b); - не работает, поворотка вообще не реагирует на координаты :(
Заранее больше спасибо. Если нужно, могу выложить код целиком
поддерживаю
Вы вводите числа как строки и непонятно, что потом с ними делаете, потому трудно сказать как Вам написать - непонятно как надо.
Попробуйте после вызовов scanf напечатать a и b и сравните. Величины b будут у Вас разными, а вот насколько это критично - неясно, т.к. непонятно что с ними потом делается.
Код мог бы помочь (из Вашего поста даже непонятно как описаны a и b), если он не очень большой и не слишком запутан. Разбираться в большом и запутанном ... ну, Вы сами понимаете.
а через какой драйвер цепляете к Орбитрону, может сменить программу управления на PSTROTATOR? Она всего 20$ и подобрать контроллер поворотки соответствующий вашему?
Следующим постом выкладываю свой скетч, он хорошо работает с WXtrack
сам проект повортки взял отсюда https://github.com/OpenATS/OpenATS)
в свой скетч добавил только вывод информации на OLED дисплей.
ua6em
к орбитрону через WispDDE... а от него сразу на com-порт ардуино
ЕвгенийП
Код выложу постом ниже... он не сложный. да я для себя все комментариями расписал.
Сначала шаговые моторы по магнитным датчикам выставляются в начал координат ( в нули)
далее ждем команд на USB. преобразовываем их и поворачиваем моторы по вертикали и горизонтали
Интересный выбор, почему не K3NG к примеру
По программе: для начала надо видимо попытаться оптимизировать использование ОЗУ!
PS не настоящий "сталевар", надеюсь настоящие поправят, если что не так сделал...
ua6em
Что-то не смог сразу разобраться с этим проектомм K3NG. а тут наткнулся на этот проект Китайца... а он как раз сделан на шаговых дигателях и с управлением под WXtrack - попробовал, и сразу все заработало.
на счет памяти - львиную долю жрет функционал OLED дисплея
KADAVR, а давайте вот так выложим - с номерами строк, а то ведь невозможно!
del
Исправил
Исправил
больше 100 строк здесь принято сворачивать и, повтор внизу подчистить
проверь правленный мной код, работает?
ua6em
больше 100 строк здесь принято сворачивать и, повтор внизу подчистить
свернул. Ваш правленный код работает на WXtrack. ORBITRON по прежнему не воспринимает формат.
странно, в пакетах ORBITRON отсутсвут последние группы символы из AZ255.7 EL1.0 UP0 DN0
во всем остальном одинаковый формат же.
А в настройках wispdde Easycomm I выбираешь? Если да, обязано работать
да, везеде это протокол ставлю.
только с orbocom идут данные вида: AZ255.7 EL1.0
а с WXtrack AZ255.7 EL1.0 UP0 DN0
и почему-то для кода ардуино важны эти последние группы UP0 DN0.
у меня sniffer com-порта есть... я вижу все данные которые программы шлют... различие только в этих двух групп символов UP0 DN0.
Вы пытаетесь ввесть величину, выделенную жирным
AZ255.7 EL1.0 UP0 DN0
в переменную b, описанную в строке №148, а она туда не лезет! Замените в строке №148 число 10 на 20, скажем и проблема должна уйти.
ЕвгенийП
Попробовал - не помогает..
да и у меня наоборот, с данными AZ255.7 EL1.0 UP0 DN0 - работает
AZ255.7 EL1.0 UP0 DN0 - нет
ЕвгенийП
Попробовал - не помогает..
да и у меня наоборот, с данными AZ255.7 EL1.0 UP0 DN0 - работает
AZ255.7 EL1.0 UP0 DN0 - нет
То, что наоборот - не удивляет - распашка памяти приводит к непредсказуемым эффектам - могут быть любые чудеса.
По любому этим символы в 10 байтов не лезут, просто посчитайте их пальцем. Это однозначная ошибка. Она не обсуждается, её надо исправлять.
Тревожит другое. Если автор позволял себе такое, то что там ещё может быть :-(
поправил на 20.
Я обратил внимание сейчас (через sniffer) что WXtrack "выплевывает свою строку с координатами сразу все символы
а ORBITRON выдает "посимвольно"
у меня в строке 168 стоит задержка 2 мс - может из за этого.. не успевают данные пройти?
да, точно, причина в этом. я сейчас в терминал передал AZ255.7 EL1.0 - и ардуино их прочитала. Видмо проблема в том, что арудино не успевает "подождать" все данные с orbitrona.
Подскажите, где в коде можно увеличить сбор данных с порта ? в строке 168 так?
а если дописать в usbdata при выходе из цикла (170 строка) код пробела?
А точнее - возврат каретки, перевод строки (x0D, x0A)
ua6em
попробую сейчас
Итого испытаний:
со строкой
usbdata +=
char
(0x0D); usbdata +=
char
(0x0A); - данные вощбще перестают приниматься обеими программами.
при установке в строке 168 значения в 10 мс - orbitron координаты принимает. Но ардуино работает не стабильно, при переключении на другой спутник - виснет. После "ресет" опять принимает координаты верно. В чем может быть причина?
еще вопрос - в строке 188.
sscanf(usb,
"AZ%s EL%s\#13"
, &a, &b); что обозначает параметр #13
подозреваю, что это код возврата каретки, десятичное 13, шестнадцатеричное 0x0D... убери перевод строки дописываемый в строку
ты свой код пытаешь или что я привёл, если свой он не будет работать нормально, памяти мало
Нет, ваш код.. но у меня Arduino mega 2560. памяти хватает
Попробуй оставить только это:
В этой конструкции, как мне кажется, во вторую переменную вычитывается строка до символа возврата каретки
sscanf(usb, "AZ%s EL%s\#13",&a, &b);
Знающие поправят...
Можно проверить - отправлять с терминала на контроллер с различным завершающим управляющим символом и смотреть, на что срабатывает, есть подозрение, что WISPDDE шлёт строку с завершающим нулём, тогда его надо заменить на возврат каретки...

Слушайте, а чего Вы мучаетесь, да выбросьте эту sscanf(usb, "AZ%s EL%s\#13",&a, &b); к чёртовой матери и поставьте нормальное чтение плавающих значений. И работать будет везде и память программы сэкономите.
Слушайте, а чего Вы мучаетесь, да выбросьте эту sscanf(usb, "AZ%s EL%s\#13",&a, &b); к чёртовой матери и поставьте нормальное чтение плавающих значений. И работать будет везде и память программы сэкономите.
я не мучаюсь, я наслаждаюсь )))
ЗЫ чесслово с разбором строк не сталкивался пока что
попробовал все варианты. проблему нашел, она действительно была в строке №148 - установил значение 20
и в строке №168 - там установил 10 мс (вместо2)
целый день тестировал на обеих программах - все работает и не глючит.
Всем спасибо за подсказки, они мне помогли.
выкладываю рабочий код, может кому понадобится для поворотки. использовать лучше MEGA2560
MaksVV
Спасибо Вам за код, попробую сегодня с вашим вариантом. Спасибо
Видимо проблема всё же в WISPDDE, уж больно стара )))
Вот как выглядит моя повортка, сделана на основе "световой головы" которые испльзуются в клубах для светомузыки.
там механика очень добротно сделана. Потроха пришлось все выкинуть, оставил только шаговые моторы
на фото только основание, без пластмассовых лицевых панелек.
тут нижняя часть привода по горизонтали
Зачёт!