-
- Всем спасибо за ответы. - Nikolaev_Aleksey(30.12.2022 11:41)
- А что б жизнь медом не казалась там еще есть URC, по крайней мере с +COPS придется что то делать. Nikolay801_(100 знак., 29.12.2022 09:27, картинка)
- А нужно ли закладывать в код игнорирование регистра ответа от GSM? Например сейчас есть ответ "Call Ready". Может ли он со временем стать "CALL READY"? - Nikolaev_Aleksey(29.12.2022 08:53)
- Все рассказали про свой опыт, но никто не дал ссылку на стандарты
V.25ter и V.250 :-) В них сокрыта мудрость веков, которой почему-то
никто не следует, даже производители :-) - il-2(28.12.2022 18:07)
- И на какой странице там скрыта мудрость? IBAH(2 знак., 28.12.2022 18:23, ссылка, ссылка)
- чего думать прыгать надо, IBAH(2021 знак., 28.12.2022 15:40)
- не так всё просто с CRLF в реальной жизни. Вот типовой набор команд
отправки письма с вложением. После команды AT+SMTPSEND почти
мгновенно получаешь ОК и CRLF. И только секунд через 10 -
+SMTRFT:1,1360 и CRLF . И только ПОСЛЕ этого можешь давать команду
AT+SMTPFT=100. Там та же картина. Надо дождаться осмысленного
выполнения команды. Вплоть до получения +SMTPSEND: 1. Везде
задержки до 10 секунд. Любые попытки не дождаться правильного
ответа - ERROR. Лaгyнoв(51 знак., 28.12.2022 17:12, картинка)
- у меня рядышком функция для двухстрочных команд, таймаут можно
поставить хоть 100500 секунд. Я выше написал, над этим автоматом
еще автомат который "дождаться осмысленного выполнения команды".
Типа так IBAH(1881 знак., 28.12.2022 17:57)
- мне понравился термин - двухстрочная команда. Надо в голове
повертеть. :-) - Лaгyнoв(28.12.2022 18:23)
- Иногда, почитав форум, становится страшно... - RED_DRAGON(28.12.2022 22:39)
- мне точно страшно за свою темность. :-) - Лaгyнoв(29.12.2022 10:30)
- Вы просто не знаете, что такое protothreads, и с чем его едят. Там
такие автоматы делаются на раз-два. - SciFi(28.12.2022 18:44)
- жалкое подобие левой руки, эти ваши прототреды - IBAH(28.12.2022 19:01)
- Бодро подтвердили своё незнание :-) - SciFi(28.12.2022 19:25)
- Зря вы их так. Мини-ОС, практически без накладных расходов, и только там где надо. - AlexBi(28.12.2022 19:05)
- жалкое подобие левой руки, эти ваши прототреды - IBAH(28.12.2022 19:01)
- Иногда, почитав форум, становится страшно... - RED_DRAGON(28.12.2022 22:39)
- мне понравился термин - двухстрочная команда. Надо в голове
повертеть. :-) - Лaгyнoв(28.12.2022 18:23)
- у меня рядышком функция для двухстрочных команд, таймаут можно
поставить хоть 100500 секунд. Я выше написал, над этим автоматом
еще автомат который "дождаться осмысленного выполнения команды".
Типа так IBAH(1881 знак., 28.12.2022 17:57)
- ИБАН, прости, но как ты умудряешься применять бесконечные? bnb62(162 знак., 28.12.2022 15:55)
- break же - mr-x(28.12.2022 17:10)
- и return - Argon(28.12.2022 17:11)
- в условии. Да ну нах. Пастор, вы видели? ну куда же вы, отец? - bnb62(28.12.2022 17:14)
- Очень удобно, когда проверка выхода где-нибудь в середине, а не в
начале/конце. Тем более удобно, если простых условий выхода
несколько, не надо из них городить одно уродское суперусловие. - mr-x(28.12.2022 17:27)
- +1 - Nikolay801_(29.12.2022 10:47)
- И чо? Условие есть либо в заголовке либо в теле цикла, какая
разница? - =AlexD=(28.12.2022 17:15)
- Да, жизнеспособно, но избегаю. Как только увижу while(1) вместо
хотя бы однократного прохода условия: do{...} while(...). - bnb62(28.12.2022 17:22)
- никто и не спорит, что любую программу можно написать на паскале,
но частенько народ жертвует наглядность в пользу эффективности - =AlexD=(28.12.2022 17:31)
- PS чем наглядность текста на Паскале не угодила? разбиение по
модулям и ObjectPascal решают овердох@я проблем. Не имел дела с
Паскалем старшее Турбопаскаля3.0 но и там все пучком. Если брать
объектные расширения турбопаскаля то все встает куда надо, а Обжект
Паскаль как бэ вполне себе юзабельный язык для вполне комплексных
задач. - RED_DRAGON(28.12.2022 22:30)
- чем наглядность текста на Паскале не угодила? ровно наоборот - =AlexD=(29.12.2022 09:28)
- извиняюсь :) - RED_DRAGON(29.12.2022 11:04)
- чем наглядность текста на Паскале не угодила? ровно наоборот - =AlexD=(29.12.2022 09:28)
- PS чем наглядность текста на Паскале не угодила? разбиение по
модулям и ObjectPascal решают овердох@я проблем. Не имел дела с
Паскалем старшее Турбопаскаля3.0 но и там все пучком. Если брать
объектные расширения турбопаскаля то все встает куда надо, а Обжект
Паскаль как бэ вполне себе юзабельный язык для вполне комплексных
задач. - RED_DRAGON(28.12.2022 22:30)
- никто и не спорит, что любую программу можно написать на паскале,
но частенько народ жертвует наглядность в пользу эффективности - =AlexD=(28.12.2022 17:31)
- Да, жизнеспособно, но избегаю. Как только увижу while(1) вместо
хотя бы однократного прохода условия: do{...} while(...). - bnb62(28.12.2022 17:22)
- Очень удобно, когда проверка выхода где-нибудь в середине, а не в
начале/конце. Тем более удобно, если простых условий выхода
несколько, не надо из них городить одно уродское суперусловие. - mr-x(28.12.2022 17:27)
- в условии. Да ну нах. Пастор, вы видели? ну куда же вы, отец? - bnb62(28.12.2022 17:14)
- и return - Argon(28.12.2022 17:11)
- break же - mr-x(28.12.2022 17:10)
- не так всё просто с CRLF в реальной жизни. Вот типовой набор команд
отправки письма с вложением. После команды AT+SMTPSEND почти
мгновенно получаешь ОК и CRLF. И только секунд через 10 -
+SMTRFT:1,1360 и CRLF . И только ПОСЛЕ этого можешь давать команду
AT+SMTPFT=100. Там та же картина. Надо дождаться осмысленного
выполнения команды. Вплоть до получения +SMTPSEND: 1. Везде
задержки до 10 секунд. Любые попытки не дождаться правильного
ответа - ERROR. Лaгyнoв(51 знак., 28.12.2022 17:12, картинка)
- кольцевой буфер приема по дма, в фоне ищу начало и конец АТ строки,
дальше переписываю строку в линейный буфер и парс индивидуально
каждой строки в зависимости от АТ команды(данных) - 0men(28.12.2022 14:37)
- дальше переписываю строку в линейный буфер - Это "частный случай". А если данные с CAN (3 аппаратных канала stm32F765) 1 Mbit каждый пишутся в SD card - реализовано FATFS. Но при этом надо сливать их на сервер, При этом надо еще получать и применять "на лету" изменяемый конфиг. Бля, я в ахуе, но решаю в одну каску. Заказчик естестественно негодуе. :) - bnb62(28.12.2022 15:27)
- Например, стоит посмотреть и оценить всю "кухню" весьма непростого парсинга. (здесь уже обсуждалось с резюмэ - "излишне заморочно и не наш Язык си... и не надо так делать"). Но парсинг на самом деле только такой, хитрожопый... Но я сделал по-своему. bnb62(341 знак., 28.12.2022 13:54 - 14:23, ссылка, ссылка)
- организую приём команд от BT/WiFi модулей построчно (небольшой
буфер чтоб поместилась строка, заканчивающаяся CRLF и учётом
таймаута приёма, а потом посимвольный парсинг с учётом того, что
пробел, как правило, - разделитель). Но парсить приходится по
индивидуальным правилам, в зависимости от ситуации, разные отклики
на разные команды (фактически ветвление с прямым сравнением с
шаблонами) Adept(730 знак., 28.12.2022 14:14)
- с GSM-модемами засада часто бывает по поводу CRLF. Они там часто промежуточные. Даешь АТ-команду и почти сразу получаешь ОК и первый раз CRLF. Через несколько секунд придет еще, а еще через 10-15 секунд еще. Даже "+" надо дождаться не один раз а иногда два раза. И только тогда обмен по поводу одной из команд завершен. А иначе влезешь со следующей АТ и получишь ERROR - Лaгyнoв(28.12.2022 16:57)
- Я парсил на ходу, и если не получал корректной строки, то ждал
следующей. Обработка символа в прерывании, парсил в фоне по флагу
приема символа. - Codavr(28.12.2022 13:47)
- +1 В фоне. Также делал и делаю (правда не конкретно AT команды, но очень схожий по сути протокол ). Составляющие: Вход в прерывание по Rx. Окно массива данных (по максимально возможной записи и скане что надо выхватить в поступающем потоке принимаемых данных). Алгоритм: применение флага(ов) в ходе парсинга. При сбое/несоответствии со "словорём"> обнуляю счётчик массива>читаю следующЕЕ в потоке. - SERGHIO(28.12.2022 14:25)
- Для приёма NMEA завёл структуру, в которой есть указатель на строку - заголовок NMEA строки, указатель на обработчик строки такого типа. Из структур составил массив. Принимающая функция перекладывает строку из FIFO в линейный буфер, ищет совпадение заголовков в массиве, вызывает соответствующий обработчик. - mr-x(28.12.2022 13:45)
- Я бы так и делал. Накопить строку, потом распарсить. Накапливаем,
не забывая следить за переполнением, конечно. Парсил бы при помощи
sscanf, strtok или чего-то такого. - SciFi(28.12.2022 13:43)
- А другого и нет, библиотечного. Именно так и парсят. :) - bnb62(28.12.2022 16:01)
- По-моему, ваш любимый иранец с этим несогласный. Изобретал какой-то другой велосипед. - SciFi(28.12.2022 16:17)
- А другого и нет, библиотечного. Именно так и парсят. :) - bnb62(28.12.2022 16:01)
- Я делал когда-то так. Всё работало (расшифровка запросов с ЧПУ станка). Из буфера копировал строку-запрос в линейный буфер, дальше поиск по маске, возврат указателя. Он либо указывает на первый символ после совпадения, либо пустой, если уперлись в конец строки и ничего не совпало. Были ещё таймауты на приём и пр. - vpv.vpv(28.12.2022 13:33)
- я вот тоже сейчас пытаюсь соорудить некий автомат состояний. До этого у меня тупо отрабатывалась каждая АТ-команда отдельно. Я туда шлю и потом смотрю ответ. И так по каждой команде. Сейчас хочу в прерываниях по ответам переходить туда-сюда. Типа дерево ветвлений. В зависимости от начальной цели (HTTP/ Email/ FTP) - Лaгyнoв(28.12.2022 12:58)
- Я бы парсил сразу, до завершения строки, по факту поступления
символов. Всегда ли будет завершение строки? - Nikolay_Po(28.12.2022 12:56)
- Да, в STM32 HAL есть и "фишка" - прерывание по событию. IDLE_Callback. HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size). bnb62(439 знак., 28.12.2022 17:03)
- Думается, если завершение строки должно быть - значит должно быть.
Если произошёл какой-то сбой, надо его отлавливать и как-то
отрабатывать, завершение ли строки пропало или ещё чего. Не
помешает ещё отслеживать паузы в передаче, если пауза больше N
времени, то в буфере ничего вразумительного быть не может, можно
выбрасывать содержимое. - mr-x(28.12.2022 13:36)
- Спасибо. Так точно - "времянка"! и решения. - bnb62(28.12.2022 16:05)