Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Ответ
Опции темы
Непрочитано 13.07.2017, 22:00   #41
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от eddy Посмотреть сообщение
Всегда есть какой-то предел, когда насрать, что пропустили часть данных.
Ну да, по большому счету почти все пропуски исправляются логикой работы программы.

Но в варианте "2 буфера со сменой активного в прерывании по \r" получается очень нехорошо, например, если в текстовом режиме прочитать даже однострочную СМСку (+CMGR) - в один буфер упадет ответ с параметрами (среди которых, между прочим, номер отправителя) во второй собственно текст, а сразу за текстом летит "ОК" и портит первый буфер, если прога замешкалась и уже не распарсила его.

Лично я за один кольцевой буфер побольше - больше возможностей для маневра.)))
Реклама:
AR_Favorit вне форума   Ответить с цитированием
Непрочитано 13.07.2017, 23:58   #42
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Если один большой буфер то как тогда его лучше анализировать? Тоже искать символы начала и конца ответов? Потом strncmp сравнивать начиная с конкретного места в строке?
miwutka вне форума   Ответить с цитированием
Непрочитано 14.07.2017, 00:00   #43
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от AR_Favorit Посмотреть сообщение
Лично я за один кольцевой буфер побольше - больше возможностей для маневра.)))
какие маневры можно сделать есть у вас время немного ознакомить меня? )) Ну для примера... мож чего запользую.... Надо же у когото опыта отбирать хоть по капельке...
miwutka вне форума   Ответить с цитированием
Непрочитано 14.07.2017, 00:34   #44
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от miwutka Посмотреть сообщение
Если один большой буфер то как тогда его лучше анализировать? Тоже искать символы начала и конца ответов? Потом strncmp сравнивать начиная с конкретного места в строке?
Именно, AR_Favorit уже написал как - конечным автоматом определять начало и конец (или длину) и передавать их дальше на обработку(поиск). Обработчик прерывания занимается только приёмом/передачей и ловлей ошибок передачи/переполнения. Вот только для поиска прямо в кольцевом буфере strncmp вряд-ли подойдёт, скорее всего придётся писать свои, но это просто.
Вот неплохая статья, хотя там примеры с modbus и клавиатурой, но принцип тот же http://kit-e.ru/articles/circuit/2006_11_164.php
H4LF вне форума   Ответить с цитированием
Сказали "Спасибо" H4LF
miwutka (14.07.2017)
Непрочитано 14.07.2017, 09:06   #45
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,653
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от AR_Favorit Посмотреть сообщение
Лично я за один кольцевой буфер побольше - больше возможностей для маневра.)))
От задачи зависит. С GPS проще два буфера (хотя, я сомневаюсь, что может возникнуть ситуация, когда за 1 секунду не успеешь данные из буфера распарсить), а с GSM, наверное, действительно лучше один кольцевой буфер побольше. Правда, если будет переполнение, то к чертям пойдет все содержимое...
Сообщение от miwutka Посмотреть сообщение
Если один большой буфер то как тогда его лучше анализировать?
Я бы в промежуточный буфер сначала считывал данные вплоть до последнего '\n', потом их анализировал. Заодно освобождается сразу гора места в кольцевом буфере. А промежуточный буфер имеет обычный вид для всяких strchr, strstr и т.п.
А вообще, у меня уже пару лет валяются GSM модули, все никак руки не дойдут для них прошивку под STM32F030 нарисовать (да и под другие МК все это влет пойдет). Можно было бы дополнительную приблуду к автосигнализации сделать или чем-нибудь удаленно управлять.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума   Ответить с цитированием
Непрочитано 14.07.2017, 12:34   #46
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от miwutka Посмотреть сообщение
Значит я просто получаю ответ из шести возможных, очищаю буфер весь,
Физически чистить не обязательно. Достаточно перенести указатель на начало буфера, предварительно скопировав его для обработки в другой буфер. Пока будешь разбирать и анализировать скопированное, в приёмный буфер будут приниматься новые символы, затирая старые. В твоём случае, кстати, признак окончания приёма строки - коды 0x0D - "ввод". И "перенос строки" 0x0A (кстати, в С строки заканчиваются кодом 0, учитывай это, работая с библиотечными функциями обработки строк). Это если ты хочешь построчно разбирать, то, как ты и говорил, отслеживать конец строки по этой комбинации символов. Можно как AR_Favorit, говорит, ориентироваться по переполнению буфера, но это более громоздко, и менее очевидно для неопытных программистов, и часто допускаются дурацкие ошибки.
Someone вне форума   Ответить с цитированием
Сказали "Спасибо" Someone
miwutka (14.07.2017)
Непрочитано 14.07.2017, 12:41   #47
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от AR_Favorit Посмотреть сообщение
А беспокоиться не из-за проверки символа на равенство \r или \n, а из-за того, что по результату предлагается сразу же и заняться парсингом,
Да не предлагает он парсингом заниматься в прерывании - только определить конец строки, и выставить флаг "строка принята", и установить указатель приёмного буфера в начало, ну ещё быть может скопировать из приёмного буфера в буфер для последующего приёма. А уже в основном цикле, проверив наличие флага "строка принята", производить разбор принятого.
Someone вне форума   Ответить с цитированием
Непрочитано 14.07.2017, 13:22   #48
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Копировать буфер в прерывании - это не красиво. Красиво - переключать указатели и поднимать флаги.
Easyrider83 вне форума   Ответить с цитированием
Непрочитано 14.07.2017, 23:34   #49
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от Someone Посмотреть сообщение
Можно как AR_Favorit, говорит, ориентироваться по переполнению буфера
Разве он такое говорил? Как я понял - он говорил о контроле переполнения кольцевого буфера. В прерывании только инкрементируется указатель записи и производится сама запись в буфер, плюс отслеживание ошибок, в том числе переполнения кольца, если нужно. А в основной программе постоянно(т.е. в основном цикле, не блокируя ход программы) сравниваются индекс чтения и индекс записи, и если не равны, то читаются байты (с инкрементом индекса чтения) пока не станут равны индексы и вычитываемые байты отправляются на КА который и определяет начало/конец/длину строки. И передаёт полученные данные на обработку далее.
Вариант возможного кода был в другой и не такой давней теме, тоже про работу с модемом, ЕМНИП.
H4LF вне форума   Ответить с цитированием
Непрочитано 15.07.2017, 16:20   #50
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от H4LF Посмотреть сообщение
Как я понял - он говорил о контроле переполнения кольцевого буфера. В прерывании только инкрементируется указатель записи и производится сама запись в буфер, плюс отслеживание ошибок, в том числе переполнения кольца, если нужно. А в основной программе постоянно(т.е. в основном цикле, не блокируя ход программы) сравниваются индекс чтения и индекс записи, и если не равны, то читаются байты (с инкрементом индекса чтения) пока не станут равны индексы и вычитываемые байты отправляются на КА который и определяет начало/конец/длину строки. И передаёт полученные данные на обработку далее.
Именно так.
Как вариант, использую вместо сравнения индексов записи и чтения из кольцевого буфера лишнюю переменную - счетчик количества принятых, но еще не считанных символов в кольцевом буфере. При приеме символа и записи его в кольцевой буфер она инкрементируется, а при считывании из кольцевого в промежуточный буфер - декрементируется. Лишняя переменная, но выглядит более наглядно (собственно, в куске кода, что привел, именно этот подход и используется.
AR_Favorit вне форума   Ответить с цитированием
Ответ

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32f415 и usart b USB bass1981 ARM 0 07.07.2017 14:47
Глюк приёма данных по USART supercelt ARM 85 18.04.2017 04:58
Почему USART работает правильно? zhan99999 Микроконтроллеры, АЦП, память и т.д 10 24.01.2010 15:39
Помогите разобраться с USART в CodeVisionAVR vendim Микроконтроллеры, АЦП, память и т.д 20 26.07.2007 16:42


Часовой пояс GMT +4, время: 23:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot