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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 07.01.2011, 18:37  
yeroglyph
Частый гость
 
Регистрация: 08.09.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
yeroglyph на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Для вашей задачи лучше использовать обыкновенный линейный буфер.
Сами числа переводить в ASCII - да.
И ввести маркер начала пакета - байт или слово - что угодно, лишь бы не пересекалось с ASCII-кодами цифр. Тогда по его приходу начинаем забивать буфер с 0. Забили всё (31 или 30 байт) - анализируем.
Можно даже ввести контрольную сумму и/или маркер конца пекета - простор полный. Тем более время приёма не критично, походу.
Реклама:
yeroglyph вне форума  
Сказали "Спасибо" yeroglyph
kiberman4000 (10.01.2011)
Непрочитано 07.01.2011, 20:33  
kargal
Прописка
 
Регистрация: 07.01.2009
Сообщений: 152
Сказал спасибо: 84
Сказали Спасибо 98 раз(а) в 57 сообщении(ях)
kargal на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от code-by Посмотреть сообщение
....лучше их передавать в виде символов (т.е. вместо 1 отправлять не 0x01, а 0x31 - код цирфы 1)?
Передача в виде символов - избыточна и ее следует применять только в целях:
• Побайтовой проверки посылки по содержимому - коды из "чужого" диапазона значений намекают на порчу посылки (сбой в линии);
• Передачи данных не сплошным потоком, а с разбивкой, с помощью символов-разделителей, на сообщения - каждое сообщение начинается идентификатором сообщения (хидером), а заканчивается признаком конца. Коды разделителей выбираются из диапазона значений, не используемого для кодирования цифр. (Для признака конца хорошо подходит спец-символ LF – информацию хорошо принимать и легко опознавать на компьютере любой программой-терминалом).
Кроме того, разбивка на сообщения позволяет легко восстанавливать синхронизацию данных на приеме (исключать влияние потерянных или испорченных байтов) и дополнительно контролировать сообщения по длине.

Сообщение от code-by Посмотреть сообщение
....стоит ли делать реализацию обмена данными по уарт (прием и отправка) с применением кольцевого буфера?
Если делать обстоятельно, то надо вводить два буфера (входной и выходной), а задачу – разделить:
• Отдельный драйвер UART'а, работающий по прерываниям от него, считывает данные из приемника UART'а во входной буфер, оповещая основную программу о приходе каждого полного сообщения, и отправляет сообщения из выходного буфера (по мере готовности передатчика UART'а) до его опустошения.
• Основная программа считывает из входного буфера полные сообщения когда ей заблагорассудится (а не суматошно-срочно побайтово) и заносит в выходной буфер свои сообщения по мере их формирования. Единственная дополнительная забота – спровоцировать старт драйвер UART'а, если на момент занесения в буфер сообщения для передачи драйвер бездельничал (например, имитацией прерывания от UART'а).

Организация буферов может быть разная:
• Кольцевой байтовый – звучит красиво, универсален, но уж очень суетно побайтово отслеживать текущий занятый объем (начало/конец свободного места) и контролировать переполнение буфера.
• Буфер на несколько полных сообщений (несколько строчек с длиной, превышающей длину максимального по размеру сообщения. Организация похожа на FIFO – читаются сообщения из буфера всегда из "первой" строчки, потом "первая" строчка переназначается (кольцевой буфер сообщений) или информация в буфере сдвигается в сторону фиксированной первой строчки (перемещение массива при таком объеме информации много времени не займет). Объем буфера определяется скоростью обработки сообщения и трафиком. Учет свободного/занятого места – построчный.
• Удобно двойное буферирование на приеме микропроцессором – буфер на одну строчку, куда собирает сообщение драйвер UART'а и откуда посылка, по завершению приема, перемещается в основной входной буфер сообщений. Такая структура дает выигрыш, если микропроцессор может адресовать память с помощью нескольких разных адресных регистров (меньше шансов драйверу UART'а и основной программе спотыкаться друг о друга).

Сообщение от code-by Посмотреть сообщение
....стоит ли делать проверку по таймеру на прием, если пакеты и так идут каждые 2-3 секунды?
Вопрос абсолютно мутный. Что проверять по таймеру?
• При передаче от микропроцессора в компьютер можно не париться, слать непрерывно – компьютер принять всегда успеет. Причем неважно, понимает посылки компьютер или он уже давно выключен. Отправляемые посылки линию передачи не протрут.
• При приеме микропроцессор может не успевать обрабатывать сообщения в темпе, доступном копьютеру для их отправки. Для предотвращения переполнения буфера и потери информации можно модифицировать протокол. Например, считать, что абонент всегда способен принять сообщение полностью (не застревает в середине сообщения), а линия (абонент) занята после передачи в нее каждого сообщения и перед отправкой следущего надо дождаться ответного статусного сигнала готовности. Сигналом готовности может быть либо спец-символ (при символьном кодировании информации) либо сигнал статусного бита COM-порта (сигнал с отдельного порта микропроцессора подается на статусные входы COM-порта компьютера – DSR и/или CTS, как удобнее уговорить драйвер COM-порта).
Если еще договориться, что спец-символ готовности всегда изымается из потока драйвером принимающей стороны, то и посылать его можно в любой момент, то есть даже вставлять его между символами передаваемого сообщения.
А уж сверх того, можно завести таймер с большим (200-500 мсек) интервалом и считать, что по его окончании отправлять посылки уже можно (может кто-нибудь что-нибудь услышит). Такой большой интервал не страшен – в нормальной работе отправка будет производиться по реальной готовности и таймер и не потребуется, и не помешает. Но при неработающей системе можно будет проверять (осциллографом), до какого места безответный сигнал доходит.
kargal вне форума  
Непрочитано 07.01.2011, 23:18  
Vovik57
Частый гость
 
Регистрация: 10.05.2007
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Vovik57 на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от kargal Посмотреть сообщение
• При приеме микропроцессор может не успевать обрабатывать сообщения в темпе, доступном копьютеру для их отправки.
Вообще-то в модуле UART уже есть приёмный буфер размером в 1 байт, если возможна ситуация его переполнения- стоит задуматься об архитектуре всей программы имхо.
__________________
Думать вредно! Знать полезно.
Vovik57 вне форума  
Непрочитано 08.01.2011, 22:04  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Да при квитировании! Какой к чёрту буфер при Такой скорости обмена!- получил(РЕГИСТР очистился (1 байт))- подтвердил ...кури бамбук(занимайся своими делами) до следующего байта. (Хотел предложить 9- бит выставлять для начала посылки - а потом 15 байт(или сколько там ?)считать ...с компом не пройдёт ...Ну тогда неиспользуемый байт в качестве начала - и как предложено- в ASCII передавать (всего в 2 раза трафик увеличится)- Скорость Обмена- Мизерная-же)
PS. yeroglyph Сорри ! Не прочитал Вашего сообщения. Я вообще-то - про ТОже. (смысл тот-же - с нюансами)

Последний раз редактировалось OlegNZH; 08.01.2011 в 22:26.
OlegNZH вне форума  
Непрочитано 09.01.2011, 21:00  
IKS_ii
Прохожий
 
Регистрация: 04.11.2008
Адрес: Минск
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
IKS_ii на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Вопрос в том, что делать если помехи накидали в буфер аж 9 бит, что программа считает принятым байтом... Что делать для восстановления первоначального формата и размера посылок ?
Предлагалось по таймеру если больше ничего не приходит, то сбрасывать даже правильно принятые заголовки сообщений.
IKS_ii вне форума  
Непрочитано 09.01.2011, 21:19  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Что это за помехи, которые чётко старт бит накидали - и потом ещё стоп-бит отметили....... Это Простой шум ..и чего из него принимать?
OlegNZH вне форума  
Непрочитано 10.01.2011, 01:07  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от OlegNZH Посмотреть сообщение
Что это за помехи, которые чётко старт бит накидали - и потом ещё стоп-бит отметили....... Это Простой шум ..и чего из него принимать?
Из личного опыта. Делали микро-пультик управления объективом, кодовое название "граната" (похож - ручка и сверху кубик с кольцами). Передача - по радио, протокол - как я делал стандартно - маркер, номер посылки, данные, контрсумма.

Так вот - при выключенной "гранате" - коробочка управления объективом раз в час-два делала "дерг". При рассмотрении оказалось, что радиомодуль при отсутствии сигнала на выход выдает эфирный шум (ну, знаете - ШШШШШШШШ!).

Что там говорили про миллион обезьян с пишущими машинками? Ага. Тут как раз тот случай.

Проблема была решена введением второй контрсуммы (первая - дополнение до 0, вторая- XOR) и доп. контролем входных данных, положение ограничивалось 12 разрядами.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 10.01.2011, 04:35  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от nml Посмотреть сообщение
Из личного опыта. Делали микро-пультик управления объективом, кодовое название "граната" (похож - ручка и сверху кубик с кольцами). Передача - по радио, протокол - как я делал стандартно - маркер, номер посылки, данные, контрсумма.

Так вот - при выключенной "гранате" - коробочка управления объективом раз в час-два делала "дерг". При рассмотрении оказалось, что радиомодуль при отсутствии сигнала на выход выдает эфирный шум (ну, знаете - ШШШШШШШШ!).

Что там говорили про миллион обезьян с пишущими машинками? Ага. Тут как раз тот случай.

Проблема была решена введением второй контрсуммы (первая - дополнение до 0, вторая- XOR) и доп. контролем входных данных, положение ограничивалось 12 разрядами.
Так и-про ТО-же! БЕЛЫЙ ШУМ наложить на UART - так- он Примет его в Итоге...НО! Информативности от этого не прибавится Так,что-там -скорее всего аппаратная заморочка ещё - ловит, что попало..
OlegNZH вне форума  
Непрочитано 10.01.2011, 12:09  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

спасибо за ответы. как всегда, сколько людей, столько мнений.
кто про перегон чисел в виде числе, кто за перегон в виде ASCII. Хотя считаю это лишние данные и лишняя работа для МК.
Забыл сообщить, что обмен будет не между МК-ПК, а между двумя МК AVR mega.
Думаю, надо отравлять код начала передачи (например, 0xBE (begin), потом 15 чисел int, их значения будут от 99 до 1499, потом конец пакета 0xED (EnD).
code-by вне форума  
Непрочитано 10.01.2011, 13:11  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

-до 1499............. а вдруг вторым байтом- конец получится?
PS. Смысла Ноль - принимаете 2 байта- анализируете 1 ....Любая помеха(пропущенный байт- - и Всё слетело ) простое квитирование - и анализ
PPS. ЕСЛИ МК-МК -проще 9-й бит использовать для служебных .

Последний раз редактировалось OlegNZH; 10.01.2011 в 13:21.
OlegNZH вне форума  
 

Закладки

Метки
avr, uart, буфер
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инверсия uart в at89c52 sanek231081 Микроконтроллеры, АЦП, память и т.д 2 04.01.2011 11:22
Симуляция UART для AVR studio mm12345 Микроконтроллеры, АЦП, память и т.д 0 22.11.2010 15:40
Подключение Siemens A52 по UART serb-radio Микроконтроллеры, АЦП, память и т.д 2 30.09.2010 07:15
Нужно 2 UART на мк , как быть? Zemlyanov Микроконтроллеры, АЦП, память и т.д 77 04.05.2010 19:26
Нужна простая библиотечка программного UART на С DK Микроконтроллеры, АЦП, память и т.д 7 08.04.2010 06:01


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


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