Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.01.2011, 21:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.06.2010
Адрес: Минск
Сообщений: 1,511
Сказал спасибо: 916
Сказали Спасибо 1,275 раз(а) в 488 сообщении(ях)
|
Re: Кольцевой буфер uart
nml, мое "спасибо" - это не ошибка . Использовала пример с Вашего сайта (обмен с МК по UART) у себя в программе.
|
|
|
|
12.01.2011, 11:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Кольцевой буфер uart
Сообщение от code-by
|
если маркер дублировать, например 0x55, то наверное нет необходимости переводить числа в ascii
|
А что, среди Ваших 15-ти int'ов не может встретиться число 21845?
Погуглите наконец "MODBUS", "протокол rs232", "протокол последовательного обмена" и т.п. Поверьте, многое уже придумано до нас.
|
|
|
|
12.01.2011, 11:42
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Кольцевой буфер uart
я уже выше писал, что числа будут от 99 до 1499.
|
|
|
|
12.01.2011, 12:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Кольцевой буфер uart
Сообщение от code-by
|
я уже выше писал, что числа будут от 99 до 1499.
|
Да, тогда конечно. А Вы перечитайте внимательно посты 24 и 29.
|
|
|
|
12.01.2011, 13:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Кольцевой буфер uart
Можно ещё дальше потеоретизировать .Например - маркер 0x55- один из самых Худших ( наряду с 0x00 и 0xFF) -Синус можно словить (а по 0 и FF - одиночную помеху) .Я понимаю, что если такое случится- то аппаратную часть нужно в помойку , но всё-же .
PS . а при ..."до 1499"- младший байт "гуляет " в полном диапазоне.
|
|
|
|
12.01.2011, 13:09
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Кольцевой буфер uart
Сообщение от makakus
|
А что, среди Ваших 15-ти int'ов не может встретиться число 21845?
Погуглите наконец "MODBUS", "протокол rs232", "протокол последовательного обмена" и т.п. Поверьте, многое уже придумано до нас.
|
Вы смысла не понимаете. Есть понятие битстаффинг и байтстаффинг. Если первое здесь неприменимо, то второе - вполне.
Итак маркер может быть любым. Например 0x55. Он есть начало пакета. За ним идёт байт кода команды или что-то другое отличное от 0x55.
Если маркер встречается в потоке данных, то он дублируется.
==
На распаковывающей стороне проверяется:
по первому маркеру устанавливается признак.
Если следом идёт маркер, то признак сбрасывается а код вашего маркера 0x55 идёт в поток принимаемых данных. Если же следом за маркером идёт байт отличный от маркера, то устанавливается признак начала пакета байт воспринимается как код команды, счётчик принятых байт сбрасывается.
Вот и всё вкратце. Таким образом пакет может упаковываться внутри непрерывного потока даных.
===
Теперь по поводу кольцевого буфера.
Имеется 2 варианта.
1. Каждый новый пакет записывается с начала буфера (нет кольца).
В этом случае предыдущий пакет затирается и должен быть обработан до начала приёма нового.
2. Кольцевой буфер.
На самом деле обслуживание кольцевого буфера - примитивная задача. Очень простая. Если вы не управляете потоком данных (то есть не используете RTS/CTS или XON/XOFF), то у вас размер буфера должен быть таким, чтобы новое сообщение не могло затереть старое до завершения обработки. Если же управляете потоком, то вы должны следить за заполнением буфера (что тоже - одна строчка на Си).
===
Честно говоря непонятно из-за чего ломать копья.
|
|
|
|
12.01.2011, 13:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Кольцевой буфер uart
Сообщение от SasaVitebsk
|
Вы смысла не понимаете. Есть понятие битстаффинг и байтстаффинг. Если первое здесь неприменимо, то второе - вполне.
|
Я понимаю Просто описался, не подумал.
Я думаю, что правильно - это накидать топикстартеру слов по теме вопроса: "байтстаффинг", "модбус", "протокол обмена"... дальше он возьмёт гугл/яндекс/рамблер, поищет там это всё и спросит уже про нюансы какие-то. А решать его задачу за него мы не должны, да и не сможем даже если захотим, это нужно полное ТЗ с гаком.
|
|
|
|
12.01.2011, 13:28
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Кольцевой буфер uart
Сообщение от Марья-2
|
Использовала пример с Вашего сайта (обмен с МК по UART) у себя в программе.
|
это где (можно полную ссылку)?
|
|
|
|
12.01.2011, 13:43
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Кольцевой буфер uart
Сообщение от makakus
|
Я понимаю Просто описался, не подумал.
Я думаю, что правильно - это накидать топикстартеру слов по теме вопроса: "байтстаффинг", "модбус", "протокол обмена"... дальше он возьмёт гугл/яндекс/рамблер, поищет там это всё и спросит уже про нюансы какие-то. А решать его задачу за него мы не должны, да и не сможем даже если захотим, это нужно полное ТЗ с гаком.
|
Согласен.
Есть примитивный протокол который называется WAKE-UP. К нему существует куча исходников. Он прост для понимания и основа у него вполне приемлемая. Существуют тестировочные проги на IBM и компоненты для DELFI например. Можете использовать как готовый протокол.
|
|
|
|
17.01.2011, 17:50
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Кольцевой буфер uart
Решил для начала сделать без контрольных сумм и т.п. усложнений.
Правильно ли так (avr codevision):
Код:
|
// CPU=4MHz
#include ‹mega1281.h›
#include ‹delay.h›
void UART_send(char c)
{
while ((UCSR0A & (1‹‹5))==0);
UDR0=c;
}
void SendInt(int data)
{
unsigned int x;
x=data››8;
UART_send((char) x);
x=data&0x00FF;
UART_send((char) x);
}
void main(void)
{
...
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x19; // 9600
while (1)
{
SendInt(0x5555); //begin indicator
for(i=0;i‹5;i=i++)
{
UART_send(0xED); //data indicator
SendInt((i+1)*100); //data
}
SendInt(0xDDDD); // end indicator
delay_ms(1000);
};
} |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|