15.01.2019, 17:31
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: PIC и BlueTooth
AndGrig, только лучше подробней для всех - где и что забивал этот поток байт.
Суть ошибки уже прорисовалась, осталось всем оставить четкое описание как не нужно делать
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
16.01.2019, 06:34
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,772 раз(а) в 5,896 сообщении(ях)
|
Re: PIC и BlueTooth
Сообщение от mike-y-k
|
осталось всем оставить четкое описание как не нужно делать
|
Обычно при немонстроидальном обмене работаю в ASCII. При этом информация идет символами от 0 до F, из остальных можно любой использовать для синхронизации.
Есть "стартовый" байт и признак конца строки (обычно 0x0d и 0x0a). Пока не пришел стартовый байт можно все отбрасывать. Есть некоторая избыточность, но алгоритм простой, как грабли.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
16.01.2019, 12:30
|
|
Прописка
Регистрация: 04.02.2007
Адрес: Крым
Сообщений: 243
Сказал спасибо: 208
Сказали Спасибо 315 раз(а) в 65 сообщении(ях)
|
Re: PIC и BlueTooth
Сообщение от mike-y-k
|
AndGrig, только лучше подробней для всех - где и что забивал этот поток байт.
Суть ошибки уже прорисовалась, осталось всем оставить четкое описание как не нужно делать
|
Вроде я все описал.
В даташите на PIC16F876 в разделе 10.2.2 "Асинхронный приемник USART" написано, что приемник может хранить в своем регистре только 2 байта. Если приходит 3-й байт, а регистр полон, то контроллер выставляет флаг переполнения приемника и прекращает прием. Перезагрузка контроллера командой goto 0x00 этот флаг не сбрасывает.
Передо мной стояла, в общем-то, стандартная задача - в произвольный момент времени подключиться со смартфона к контроллеру и неспешно передать/принять два байта. При подключении смартфона к блютузу, соединенному с контроллером, они знакомятся и договариваются о сотрудничестве обмениваясь информацией. И нет чтобы сделать это по тихому между собой, так все это вываливается на вход Rx контроллера. В моём случае обработка двух байт требует запрещение прерываний и занимает 4 мсек. За это время входной регистр приемника забивается и приемник выключается.
Решения задачи:
1. Нужно все это читать и выбрасывать.
2. Выключить приемник на 50 мсек, а затем опять включить.
3. Ничего не делать (приемник сам отключится) и через 50 мсек сбросить ошибку переполнения.
Как узнать, что пошел прием не нужной мне информации? Она начинается с определенного заголовка, заканчивается какой-то финальной фразой и длится чуть менее 50 мсек. Заголовок всегда начинается байтом 0х2В (нужно посмотреть еще пару байтов для надежности). Получив этот байт, я жду 50 мсек, а затем сбрасываю ошибку переполнения как описано в даташите.
Уважаемый akegor просто все читает и выбрасывает пока не придет особый заголовок сообщения. Это позволяет организовать работу с несколькими устройствами.
Я только не совсем понял "...работаю в ASCII. При этом информация идет символами от 0 до F". Ведь ASCII использует один байт, т.е. от 0х00 до 0хFF.
Вообще-то, надеялся, что есть стандартное решение этой тривиальной задачи. Кто-нибудь снисходительно похлопает меня по плечу и подскажет где искать ответ.
__________________
Если вас не устраивает ваша зарплата - отдайте её жене!
Последний раз редактировалось AndGrig; 16.01.2019 в 12:36.
|
|
|
|
16.01.2019, 13:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,560
Сказал спасибо: 5,394
Сказали Спасибо 24,777 раз(а) в 5,562 сообщении(ях)
|
Re: PIC и BlueTooth
Зачем всё так сложно?
Принялся байт - сработало прерывание - в прерывании быстренько байтик считали, сохранили в буфер и пошли работать дальше. Флаг приёма сам очистится..
__________________
«Совершенство — это не тогда, когда уже нечего больше добавить, а тогда, когда уже нечего отнять.»
/Эйнштейн/
моя домашняя страничка: http://www.eddy.com.ua/
|
|
|
|
16.01.2019, 13:21
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,772 раз(а) в 5,896 сообщении(ях)
|
Re: PIC и BlueTooth
Сообщение от AndGrig
|
Ведь ASCII использует один байт, т.е. от 0х00 до 0хFF.
|
Нибблы байта принимают значения от нуля до "Ф", они передаются соответствующими символами. Другими словами, один байт передается двумями.
В случае с модемом - жду его сообщение об успешной регистрации в сети, после этого начинаю с ним работать. Все принимается в буфер достаточного размера, не два байта.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
16.01.2019, 13:41
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: PIC и BlueTooth
AndGrig, уважаемый akegor написал об обмене распакованными бинарными данными в шестнадцатеричном формате - там действительно только 0…9, A…F. Других шестнадцатеричных цифр ещё не придумали. Пишите свою реализацию sprintf/sscanf для формата %x или %X и пользуетесь. При передаче и приёме только будет в 2 раза больше данных.
В Вашем случае при спаривании устройств прочитать все, пришедшее по UART и дальше уже продолжить нормальное выполнение.
Самое правильное - кольцевой буфер на некоторое (›2) количество символов и разборки с ним. Можете для старта своего обмена просто передать набор байт, который не встретится в основном обмене.
По совету уважаемого akegor это может быть любая отличная от используемых 0…9,A…F (0x30…0x39, 0x41…0x46, 0x61…0x66) комбинация. Например два байта 0x00…
Приём данных из UART, как и их передачу организовать на буферах в памяти и исключительно в прерываниях. В основной программе только анализ флагов и указателей.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Сказали "Спасибо" mike-y-k
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
mikroC PRO for PIC помогоите разобраться
|
igor33 |
PIC |
5 |
22.05.2016 21:19 |
Тормоза при передаче данных через UART в Bluetooth модуль
|
rus_12345 |
Микроконтроллеры, АЦП, память и т.д |
8 |
05.01.2015 19:39 |
Литература по микроконтроллерам (AVR, PIC, ПЛИС и т.д.). Сборка книг - (256 книг+ 27 CD c примерами из книг) [обновление 2011, PDF, DJVU]
|
yurinform |
Микроконтроллеры, АЦП, память и т.д |
5 |
05.07.2011 19:00 |
Вопрос про PIC 16F876А
|
Serega7777 |
Микроконтроллеры, АЦП, память и т.д |
2 |
18.12.2007 22:34 |
Часовой пояс GMT +4, время: 16:57.
|
|