13.07.2017, 22:00
|
#41
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от eddy
|
Всегда есть какой-то предел, когда насрать, что пропустили часть данных.
|
Ну да, по большому счету почти все пропуски исправляются логикой работы программы.
Но в варианте "2 буфера со сменой активного в прерывании по \r" получается очень нехорошо, например, если в текстовом режиме прочитать даже однострочную СМСку (+CMGR) - в один буфер упадет ответ с параметрами (среди которых, между прочим, номер отправителя) во второй собственно текст, а сразу за текстом летит "ОК" и портит первый буфер, если прога замешкалась и уже не распарсила его.
Лично я за один кольцевой буфер побольше - больше возможностей для маневра.)))
|
|
|
|
13.07.2017, 23:58
|
#42
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Если один большой буфер то как тогда его лучше анализировать? Тоже искать символы начала и конца ответов? Потом strncmp сравнивать начиная с конкретного места в строке?
|
|
|
|
14.07.2017, 00:00
|
#43
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от AR_Favorit
|
Лично я за один кольцевой буфер побольше - больше возможностей для маневра.)))
|
какие маневры можно сделать есть у вас время немного ознакомить меня? )) Ну для примера... мож чего запользую.... Надо же у когото опыта отбирать хоть по капельке...
|
|
|
|
14.07.2017, 00:34
|
#44
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от miwutka
|
Если один большой буфер то как тогда его лучше анализировать? Тоже искать символы начала и конца ответов? Потом strncmp сравнивать начиная с конкретного места в строке?
|
Именно, AR_Favorit уже написал как - конечным автоматом определять начало и конец (или длину) и передавать их дальше на обработку(поиск). Обработчик прерывания занимается только приёмом/передачей и ловлей ошибок передачи/переполнения. Вот только для поиска прямо в кольцевом буфере strncmp вряд-ли подойдёт, скорее всего придётся писать свои, но это просто.
Вот неплохая статья, хотя там примеры с modbus и клавиатурой, но принцип тот же http://kit-e.ru/articles/circuit/2006_11_164.php
|
|
|
|
14.07.2017, 09:06
|
#45
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,653
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от AR_Favorit
|
Лично я за один кольцевой буфер побольше - больше возможностей для маневра.)))
|
От задачи зависит. С GPS проще два буфера (хотя, я сомневаюсь, что может возникнуть ситуация, когда за 1 секунду не успеешь данные из буфера распарсить), а с GSM, наверное, действительно лучше один кольцевой буфер побольше. Правда, если будет переполнение, то к чертям пойдет все содержимое...
Сообщение от miwutka
|
Если один большой буфер то как тогда его лучше анализировать?
|
Я бы в промежуточный буфер сначала считывал данные вплоть до последнего '\n', потом их анализировал. Заодно освобождается сразу гора места в кольцевом буфере. А промежуточный буфер имеет обычный вид для всяких strchr, strstr и т.п.
А вообще, у меня уже пару лет валяются GSM модули, все никак руки не дойдут для них прошивку под STM32F030 нарисовать (да и под другие МК все это влет пойдет). Можно было бы дополнительную приблуду к автосигнализации сделать или чем-нибудь удаленно управлять.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
14.07.2017, 12:34
|
#46
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от miwutka
|
Значит я просто получаю ответ из шести возможных, очищаю буфер весь,
|
Физически чистить не обязательно. Достаточно перенести указатель на начало буфера, предварительно скопировав его для обработки в другой буфер. Пока будешь разбирать и анализировать скопированное, в приёмный буфер будут приниматься новые символы, затирая старые. В твоём случае, кстати, признак окончания приёма строки - коды 0x0D - "ввод". И "перенос строки" 0x0A (кстати, в С строки заканчиваются кодом 0, учитывай это, работая с библиотечными функциями обработки строк). Это если ты хочешь построчно разбирать, то, как ты и говорил, отслеживать конец строки по этой комбинации символов. Можно как AR_Favorit, говорит, ориентироваться по переполнению буфера, но это более громоздко, и менее очевидно для неопытных программистов, и часто допускаются дурацкие ошибки.
|
|
|
Сказали "Спасибо" Someone
|
|
|
14.07.2017, 12:41
|
#47
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от AR_Favorit
|
А беспокоиться не из-за проверки символа на равенство \r или \n, а из-за того, что по результату предлагается сразу же и заняться парсингом,
|
Да не предлагает он парсингом заниматься в прерывании - только определить конец строки, и выставить флаг "строка принята", и установить указатель приёмного буфера в начало, ну ещё быть может скопировать из приёмного буфера в буфер для последующего приёма. А уже в основном цикле, проверив наличие флага "строка принята", производить разбор принятого.
|
|
|
|
14.07.2017, 13:22
|
#48
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Копировать буфер в прерывании - это не красиво. Красиво - переключать указатели и поднимать флаги.
|
|
|
|
14.07.2017, 23:34
|
#49
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от Someone
|
Можно как AR_Favorit, говорит, ориентироваться по переполнению буфера
|
Разве он такое говорил? Как я понял - он говорил о контроле переполнения кольцевого буфера. В прерывании только инкрементируется указатель записи и производится сама запись в буфер, плюс отслеживание ошибок, в том числе переполнения кольца, если нужно. А в основной программе постоянно(т.е. в основном цикле, не блокируя ход программы) сравниваются индекс чтения и индекс записи, и если не равны, то читаются байты (с инкрементом индекса чтения) пока не станут равны индексы и вычитываемые байты отправляются на КА который и определяет начало/конец/длину строки. И передаёт полученные данные на обработку далее.
Вариант возможного кода был в другой и не такой давней теме, тоже про работу с модемом, ЕМНИП.
|
|
|
|
15.07.2017, 16:20
|
#50
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SIM800 + stm030 как правильно принимать по USART?
Сообщение от H4LF
|
Как я понял - он говорил о контроле переполнения кольцевого буфера. В прерывании только инкрементируется указатель записи и производится сама запись в буфер, плюс отслеживание ошибок, в том числе переполнения кольца, если нужно. А в основной программе постоянно(т.е. в основном цикле, не блокируя ход программы) сравниваются индекс чтения и индекс записи, и если не равны, то читаются байты (с инкрементом индекса чтения) пока не станут равны индексы и вычитываемые байты отправляются на КА который и определяет начало/конец/длину строки. И передаёт полученные данные на обработку далее.
|
Именно так.
Как вариант, использую вместо сравнения индексов записи и чтения из кольцевого буфера лишнюю переменную - счетчик количества принятых, но еще не считанных символов в кольцевом буфере. При приеме символа и записи его в кольцевой буфер она инкрементируется, а при считывании из кольцевого в промежуточный буфер - декрементируется. Лишняя переменная, но выглядит более наглядно (собственно, в куске кода, что привел, именно этот подход и используется.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:13.
|
|