02.04.2017, 15:51
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: Глюк приёма данных по USART
Сообщение от supercelt
|
поменял скорость на 4800, проверял с IDLE. 10 звонков подряд - норм. Потом поменял на 115200. С первого же звонка - накладка (IDLE сработало на 30 символе). Потом поменял как было на 9600. Тут опять рандом.
|
Если модем отправляет сообщения через DMA - все будет ОК, а если нет, то забудьте за IDLE. Даже через DMA могут быть валерьянты, если отправляемое сообщение состоит из нескольких "блоков" (только программеры модема знают, как формируется сообщение - частями или сплошным куском).
Если не хотите пить валерьянку, когда уже все готово, но вдруг выясняется, что далеко еще не все, опирайтесь на содержимое сообщения, а не на случайные паузы.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
02.04.2017, 16:36
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Глюк приёма данных по USART
Сообщение от supercelt
|
На странице 26 вообще такого нет. Там описание команды ATDI, которая ничего не меняет.
|
я читаю:
Код:
|
TC35i Terminal
Siemens Cellular Engine
Version: 02.07
DocId: TC35i_ATC_V02.07 |
А Вы что? Даже если другая версия - поиск никто не отменял.
Цитата:
|
Да есть, но они встречаются по 3 раза в ответе.
|
Показали бы уже пример что-ли... "OK" - это самостоятельный ответ, даже если и идёт после выдачи данных по запросу. Потому всегда обрамлён CRLF.
Ну и строка любой длинны в память не поместится(точнее может не поместиться).
Цитата:
|
Но а... момент когда уже можно читать-то как определяется? Что посылка зашла в буфер.
|
Как определить что ответ уже пришёл и можно искать в нём что-то? Очень просто - выделять то что находится в обрамлении CRLF и обрабатывать строку за строкой - сравнивать, искать и т.д. Не помню в деталях как делал я, но принцип такой:
1) если появились данные в кольцевом буфере - читаем байт.
2) если прошли подряд CR LF то после них считаем до появления CR LF; так же запоминаем индекс элемента после CR LF
3) Появился CR LF и при этом что-то насчитано - по запомненному индексу и насчитанной длине можно скопировать в отдельный буфер хоть с нуль терминацией и там обрабатывать. Но я искал прямо в кольцевом буфере самописной функцией.
Вот типа такого конечный автомат нужен, не знаю как правильно его описать - я не настоящий программист.
Можно кстати и через DMA если есть прерывание по приёму знака LF, вроде в каких-то STM32 оно есть.
Хотя полноценный стек(или как это называется?) управления модемом сделать не так уж и просто как может показаться...
Код:
|
поменял скорость на 4800, проверял с IDLE. 10 звонков подряд - норм. Потом поменял на 115200. С первого же звонка - накладка (IDLE сработало на 30 символе). Потом поменял как было на 9600. Тут опять рандом. То со 2, то с 1, то с 5 звонка. Потом меняю опять на 4800 - хлоп, на 8 звонке - накладка. |
Заниматься такой ерундой, вместо того чтобы делать нормальный разбор сообщений... это финиш... извиняйте, но я пас
|
|
|
|
02.04.2017, 17:16
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк приёма данных по USART
Сообщение от H4LF
|
Показали бы уже пример что-ли...
|
Какой конкретно пример показать?)
|
|
|
|
02.04.2017, 17:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,038
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Глюк приёма данных по USART
Теперь когда понятно что чудит GSM модем, можно очень легко программно определить несколько последовательных IDLE байт и по этому условию определять настоящий конец передачи.
Парсить строку тоже вариант, но я сторонник концепции KISS
|
|
|
|
02.04.2017, 17:34
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк приёма данных по USART
Сообщение от dgrishin
|
Теперь когда понятно что чудит GSM модем, можно очень легко программно определить несколько последовательных IDLE байт и по этому условию определять настоящий конец передачи.
Парсить строку тоже вариант, но я сторонник концепции KISS
|
Короче как сработало idle, проверять массив есть ли там нужное и если нет, не обнулять i ?
|
|
|
|
02.04.2017, 17:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,038
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Глюк приёма данных по USART
Сообщение от supercelt
|
Короче как сработало idle, проверять массив есть ли там нужное и если нет, не обнулять i ?
|
Никакого массива. Всё делается в обработчике - попробуйте сами напишите.
|
|
|
|
02.04.2017, 17:43
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: Глюк приёма данных по USART
Сообщение от H4LF
|
1) если появились данные в кольцевом буфере - читаем байт.
|
Если меньше шести - можно не париться. "ОК" - самый короткий ответ - из шести байтов.
Сообщение от dgrishin
|
Теперь, когда понятно что чудит GSM модем,
|
С чего это ему "чудить"? Или Вы считаете "чудачеством" работу не по Вашим хотелкам?
Сообщение от supercelt
|
проверять массив есть ли там нужное и если нет, не обнулять i ?
|
H4LF путь показал. Остается осознать и сделать.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
02.04.2017, 18:47
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Глюк приёма данных по USART
Сообщение от akegor
|
Если меньше шести - можно не париться. "ОК" - самый короткий ответ - из шести байтов.
|
Можно, но уже после того как конечный автомат(КА) определил, что что-то пришло. Читать байт из буфера и догонять записывающий указатель в любом случае надо (если конечно не запрещён приём или в каких нибудь особых случаях). Если есть главный цикл - проверку наполненности буфера и вызов КА лучше вставить туда. Естественно при этом не должно быть тупящих делеев, поллинга долгих флагов и подобного, что может застопорить главный цикл до переполнения буфера.
Сообщение от dgrishin
|
Никакого массива. Всё делается в обработчике
|
Учить плохому - так уж на полную? Так недолго и до _delay_ms(xxx) в обработчике(с запрещёнными прерываниями)...
Ну и модем не чудит, он так работает. А то, что Вы предлагаете - это не KISS а стрельба по своим ногам из автоматического оружия.
|
|
|
|
02.04.2017, 19:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,038
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Глюк приёма данных по USART
Сообщение от H4LF
|
Учить плохому - так уж на полную? Так недолго и до _delay_ms(xxx) в обработчике(с запрещёнными прерываниями)...
Ну и модем не чудит, он так работает. А то, что Вы предлагаете - это не KISS а стрельба по своим ногам из автоматического оружия.
|
Я знаю как решить эту задачу максимально простым способом (и работающим).
То, что вы предлагаете - это построение сферического коня в вакууме. Всё что нужно топикствртеру - это просто принять последовательность символов в буфер (корректно определив конец текущей передачи) и потом получить нужные значения по определённым смещениям в буфере.
Я больше не буду ничего писать - понаблюдаю куда вы заведёте топикстартера такими советами
|
|
|
|
02.04.2017, 19:32
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Глюк приёма данных по USART
Ничего страшного, если в обработчике прерывания что-то будет исполняться чуть больше, чем ничего. Если беспокоитесь за длинный код обработчика, просто понизьте приоритет этого прерывания и не дрожите за каждый шаг. NVIC допускает повторный вход в прерывание, при этом ничего не теряется.
У вас там что, используется целая куча высокоприоритетных прерываний, задержка обработки которых грозит ядерной катастрофой, чтоль?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:05.
|
|