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

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

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

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

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

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

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

 
Опции темы
Непрочитано 10.01.2011, 14:10  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

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

Квитирование- это подтверждение приёма данных(бывает аппаратное - и программное) 9 бит- в мегах заложен дополнительный бит, который можно использовать для идентификации- служебная посылка - или- данные.
OlegNZH вне форума  
Непрочитано 11.01.2011, 11:46  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

кто-ниб. может посоветовать протокол для моего случая?
и всё же отправлять числа как числа или переводить в ASCII?
code-by вне форума  
Непрочитано 11.01.2011, 12:18  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от code-by Посмотреть сообщение
Думаю, надо отравлять код начала передачи (например, 0xBE (begin), потом 15 чисел int, их значения будут от 99 до 1499, потом конец пакета 0xED (EnD).
Правильно заметили - сколько людей, чтолько и мнений, и стилей программирования.

В вашем случае (обмен между МК) я бы сделал так (у самого так работают десятки устройств)

Протокол передачи таков - пакет всегда начинается с маркера, ну скажем 0x55. Потом идет идентификатор - что передается (его может и не быть - если поток один). Потом собственно двоичные данные - на хрена паковать - распаковывать? Ну а надо на компе посмотреть для отладки - за полчаса пишется программа на дельфях. И в конце - обязательно - контрольная сумма.

И нет никакого кольцевого буфера, а прием ведется прямо в прерывании. Обработка проста - есть глобальная переменная - индекс. Так вот, исходно он == 0. При входе в прерывание приема - switch по этому индексу, и далее

если 0 - ждем маркер. принятое == маркер? если да, то индекс=1, иначе ничего.

ну итак далее... прием данных - в промежуточный буфер. По последнему - проверка контрсуммы, и если все Ок - перенести в нужную переменную и выставить флаг "принято".

Причем длина посылок м.б. разной - при приеме идентификатора (что за данные) мы определяем эту длину посылки.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 11.01.2011, 13:07  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Правильно nml написал, сам хотел такое посоветовать, именно тоже "работают десятки устройств".

В общем-то протокол похож на modbus, на нём работают миллионы устройств .

Переменная-счётчик байтов в посылке у меня изначально стоит в 0xFF. Дождался маркера начала пакета стало 0xFE. Принял счётчик байтов - равно счётчику. Дальше принимаем байты, вычитаем из счётчика пока он не стал равным нулю. Тут тормозим приём, main видит что 0, парсит пакет и устанавливает счётчик в 0xFF. Контрольная сумма - никакие не xor или сложения, а CRC8, не так уж долго она считается. У меня пакеты данных это команды, идут с интервалами, поэтому успевает обработаться одн, пока придёт следующий.
Пакеты могут теряться. Я циклически повторяю весь набор команд со старыми значениями, если юзерь ручки не дёргает и кнопки не нажимает: хоть не сразу, но потерянный пакет будет доставлен. При этом в канале есть постоянный поток, и если он прерывается на время более чем, значит, обрыв канала связи.

Да, не надо никаких 9 бит! 8-битный поток вы спокойно подслушаете через RS232 любой терминалкой и "подбросите" программкой на дельфях или вижуал бейсике написанной за 10 минут.
makakus вне форума  
Непрочитано 11.01.2011, 13:19  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от makakus Посмотреть сообщение

В общем-то протокол похож на modbus, на нём работают миллионы устройств .
Ну да. Есть вещи, которые давно придуманы и особо "улучшить" или нельзя, или смысла нету
Цитата:
Переменная-счётчик байтов в посылке у меня изначально стоит в 0xFF.
Ну это уже детали реализации.
У меня для новых пультов придуман вообще расширяемый протокол, то есть пакеты "еще неизвестные" приемнику тоже будут "париниматься", в смысле не вызывать ошибки или сбоя потока данных - просто по ним ничего не будет выставлено. Там я длину пакета кодирую 2-мя битами в идентификаторе - 0, 1, 2 или 4 байта информации.
Цитата:
Я циклически повторяю весь набор команд со старыми значениями, если юзерь ручки не дёргает и кнопки не нажимает: хоть не сразу, но потерянный пакет будет доставлен. При этом в канале есть постоянный поток, и если он прерывается на время более чем, значит, обрыв канала связи.
Примерно так же и у меня. 0.5 сек нет приема пакета - загорается красный светодиодик. Только повторять весь набор не всегда возможно - например, если в пакете передается положение ручки - можно. А дискретную команду типа "сделать то-то" - нельзя.

Но это, опять же - тонкости. Главное - маркер, данные, контрсумма, и передавать данные в программу только при хорошей контрсумме.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Сказали "Спасибо" nml
Марья-2 (11.01.2011)
Непрочитано 11.01.2011, 16:37  
yeroglyph
Частый гость
 
Регистрация: 08.09.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
yeroglyph на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Если передавать int прямо в виде бвухбайтных значений, то по крайней мере младший байт гарантированно будет временами = маркеру начала или конца. Оттого и нужно разворачивать это в 4 байта. Отправлять можно разбивая на тетрады и 1000 другими способами.
Одним из самых общепринятых вариантов - перевод в ASCII коды шестнадцатиричного представления числа. Это легко осуществляется элементарными операциями (не нагрузит МК как если возится с десятичными числами) и просто контролируется терминалом при отладке, как уже заметили товарищи. И размер пакета фиксирован, где расположено какое число - известно
Примеров - уйма, поиск рулит
yeroglyph вне форума  
Непрочитано 11.01.2011, 16:57  
yeroglyph
Частый гость
 
Регистрация: 08.09.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
yeroglyph на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Э. Парр. Программируемые контроллеры: руководство для инженера. 2007.
Со с.220.
yeroglyph вне форума  
Непрочитано 11.01.2011, 17:19  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

Сообщение от yeroglyph Посмотреть сообщение
Если передавать int прямо в виде бвухбайтных значений, то по крайней мере младший байт гарантированно будет временами = маркеру начала или конца.
Не страшно. Пакет состоит из идентификатора начала, счётчика=N, N байт двоичных данных, принимаемых без распознавания и байта CRC. При сбое будет принят пакет с неправильной контрольной суммой ( который может включить в себя несколько правильных пакетов) и отброшен. Дальше всё восстановится. Ну, есть ещё байт-стаффинг... Всё равно нельзя рассчитывать на канал без ошибок. И надо ограничивать длину пакета, при приёме пакета с аномальной длиной отбрасывать хвост текущего пакета.
Вариантов действительно масса, бес, как всегда, в деталях, у каждого своё.
makakus вне форума  
Непрочитано 11.01.2011, 19:15  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Кольцевой буфер uart

если маркер дублировать, например 0x55, то наверное нет необходимости переводить числа в ascii
code-by вне форума  
 

Закладки

Метки
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, время: 05:30.


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