реклама на сайте
подробности

 
 
> Как грамотные люди делают прием пакетов по USART
TamTam
сообщение Jun 5 2006, 01:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Ну написал с горем пополам обработку прирывания по окончанию приема байта, процедурку копирования из буфера в eeprom, но вот вопрос ???

Данные приходят всегда по разному иногда в нужной мне строке символ 0х0d и 0х0а встречаються несколько раз значит обработка пришедших данныш по окончанию строки мне не подходит, думаю так
после окончания приема запускать таймер и если за отведенное время не поступит следующий байт тогда начинать обработку данных а если данные еще идут то складываем их в еепром.

Правильно ли я мыслю или может есть способ по приличней, ведь таймер нужная и без этого весчь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TamTam
сообщение Jun 6 2006, 09:38
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(Sergiy @ Jun 6 2006, 13:15) *
Да, обратите внимание на фразу, что в обработчиках прерывания должны быть краткие функции, и не в коем случае писать незя в ЕЕПРОМ, потому что процесс достаточно длителен (мс на байт), выставьте битовую переменную, что нужный пакет в буфере обмена и готовьте следующее окно (я использую двухоконные буфера), когда один заполняется, второй готов и константен для целевой функции - все довольны, а оперирую двумя битовыми флагами, один показывает, что новый буфер подготовлен и ожидает, а второй что какое окно надо пользовать в данный момент целевой функцией, первое может менять в активное состояние прерывание приемника, в пассивное возвращает целевая функция, а окна переключаются в инверсии, да два буфера хватит если есть простой в конце заполнения второго буфера и ждать пока не будет сброшен обработки первого буфера в целевой функции.


Советик дельный, а вот что делать с размерностью буферов, ведь как известно памяти в AT90S2313
всего 128 байт надеюсь 2Х32 мне хватит через глаза.
Go to the top of the page
 
+Quote Post
Sergiy
сообщение Jun 7 2006, 08:15
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 26
Регистрация: 29-05-06
Из: Netherlands (Delft)/Ukraine (Odessa)
Пользователь №: 17 547



Цитата(TamTam @ Jun 6 2006, 11:38) *
Цитата(Sergiy @ Jun 6 2006, 13:15) *

Да, обратите внимание на фразу, что в обработчиках прерывания должны быть краткие функции, и не в коем случае писать незя в ЕЕПРОМ, потому что процесс достаточно длителен (мс на байт), выставьте битовую переменную, что нужный пакет в буфере обмена и готовьте следующее окно (я использую двухоконные буфера), когда один заполняется, второй готов и константен для целевой функции - все довольны, а оперирую двумя битовыми флагами, один показывает, что новый буфер подготовлен и ожидает, а второй что какое окно надо пользовать в данный момент целевой функцией, первое может менять в активное состояние прерывание приемника, в пассивное возвращает целевая функция, а окна переключаются в инверсии, да два буфера хватит если есть простой в конце заполнения второго буфера и ждать пока не будет сброшен обработки первого буфера в целевой функции.


Советик дельный, а вот что делать с размерностью буферов, ведь как известно памяти в AT90S2313
всего 128 байт надеюсь 2Х32 мне хватит через глаза.


Вообще все просто - надо брать размер буфера не менее чем максимальная длина пакета (он у вас наверное переменной длины - выберите максимальный вариант) - если же пакет больше, то такая буферизация вам не подходит. Странный выбор контроллера на 2006 год, надеюсь что выбор продиктован только тем, что у вас есть какая то готовая плата пятилетней давности, и вы ее хотите использовать. Потому что щас можно дешевле купить то, что получше, например Атмега8 - стоит в Украине чуть больше евро - интересно сколько стоит ваш кристалл.

Так вот если все таки максимально длинная команда больше размера того, что вы ей можете предложить, то замедляйте обмен (скорость, интервалы между байтами в одном пакете), используйте буферизацию, но выполнение выгрузки из буфера прийдется начинать тогда, когда вы не дошли до конца пакета. В основном цикле сканируйте флаг наличия нового байта в буфере (буфер должен быть кольцевой), если есть - делайте выемку байта - сдвиг указателя кольцевого буфера на -1 и запись в ЕЕПРОМ, и так постоянно. Выбор невелик. Пример реализации кольцевого буфера на cvavr:

#define RX_BUFFER_SIZE1 32 //size of rx buffer

unsigned char rx_buffer[RX_BUFFER_SIZE1+1];
register unsigned char rxr_pntr=0, rxw_pntr = 0;


// UART Receiver interrupt service routine
//--------------------------------------------------------------------------
// Procedure of RXD interrupt processing
//--------------------------------------------------------------------------
interrupt [USART_RXC] void uart_rx_isr(void)
{
unsigned char temp_byte;

temp_byte=UDR;
rx_buffer[rxw_pntr]=temp_byte;
if (rxw_pntr < RX_BUFFER_SIZE1-1)
rxw_pntr++;
else rxw_pntr=0;
}

//--------------------------------------------------------------------------
// Extract a byte from rx-buffer if buffer isn't empty
//--------------------------------------------------------------------------
void check_rx_buffer()
{
unsigned char current_byte_from_buffer;

if (rxr_pntr != rxw_pntr)
{
#asm("cli");
current_byte_from_buffer=rx_buffer[rxr_pntr];
if (rxr_pntr < RX_BUFFER_SIZE1-1)
rxr_pntr++;
else rxr_pntr=0;
#asm("sei");
rx_buffer_processor(current_byte_from_buffer); <- ваша целевая функция над текущем байтом
}
}


Удачи
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- TamTam   Как грамотные люди делают прием пакетов по USART   Jun 5 2006, 01:11
- - TamTam   Цитата(kertis @ Jun 5 2006, 05:48) не оче...   Jun 5 2006, 01:59
- - rat   Принимаемый поток организуете Вы же? Если так, то ...   Jun 5 2006, 02:36
|- - TamTam   Цитата(rat @ Jun 5 2006, 06:36) Принимаем...   Jun 5 2006, 02:49
- - haker_fox   Может быть эта ссылка Вам поможет?   Jun 5 2006, 03:04
- - TamTam   Цитата(haker_fox @ Jun 5 2006, 07:04) Мож...   Jun 5 2006, 03:44
- - beer_warrior   Идея правильная, вот пример кода который кочует из...   Jun 5 2006, 05:24
- - WHALE   Судя по 0A,0D-это модем.Действительн,в eeprom заче...   Jun 5 2006, 05:44
- - vet   Цитата(TamTam @ Jun 5 2006, 05:11) Ну нап...   Jun 5 2006, 05:59
- - Nanobyte   Лучше применять не RAM со всеми его недостатками, ...   Jun 5 2006, 07:39
- - WHALE   а почем нынче fram ?   Jun 5 2006, 07:56
|- - otrog   Цитата(WHALE @ Jun 5 2006, 11:56) а почем...   Jun 5 2006, 09:22
- - beer_warrior   Насколько я понял человек пишет во внутреннюю EEPR...   Jun 5 2006, 08:44
- - TamTam   Цитата(WHALE @ Jun 5 2006, 09:44) Судя по...   Jun 6 2006, 02:06
- - vesago   Мне понравилось как у Атмела сделано. Я такую конс...   Jun 6 2006, 08:08
- - TamTam   Цитата(vesago @ Jun 6 2006, 12:08) Мне по...   Jun 6 2006, 08:46
|- - Sergiy   Да, обратите внимание на фразу, что в обработчиках...   Jun 6 2006, 09:15
- - Sergiy   Цитата(TamTam @ Jun 6 2006, 11:38) Цитата...   Jun 7 2006, 08:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016