Цитата(Andrey Sudnov @ Dec 21 2007, 01:53)

Т.е. делать по моему? Я вспомнил! Сделал побайтно из-за того, что так проще принимать строки.
Нет, делать побайтно я не советовал.
Цитата(Andrey Sudnov @ Dec 21 2007, 01:53)

Совсем забыл как работает этот PDU. Сейчас глянул. Без отключения приемника не обойтись, так как установить адрес на следующий буфер и счетчик надо одновременно! Это если адрес буфера будет все время разный, "произвольный", для обработчика прерываний, неизвестный ему заранее. Если использовать один и тот же буфер или пару, то без выключения приемника обойтись можно.
Объясните мне, какой смысл писать адрес и счетчик в разное время?
Понял Ваше определение "произвольного" буфера. ИМХО, те буферы, с которыми работает PDC должны быть однозначно фиксированными - задача PDC и буферизации состоит прежде всего в разгрузке процессора и обеспечении надежного приема, а дальнейшая судьба данных - дело пользовательского приложения, и обработчик прерывания заботиться о ней не должен.
Цитата(Andrey Sudnov @ Dec 21 2007, 01:53)

Плюс с PDC появляется проблема с приемом строк произвольной длины. Как ее организовать? Ловить прерывание по таймауту, копировать (!) буфер от значения до текущего адреса? Или PDC переходит на следующий буфер по таймауту?
Опишите пожалуйста парой слов Ваш алгоритм, так сказать путь данных от UART до пользовательского буфера. Куда указывает адрес и следующий адрес в PDC (в течение всего цикла)?
Попробую, парой слов не обойдется, правда.

Итак:
1. Заводим два одинаковых буфера.
2. Прописываем в PDC_RPR и PDC_RCR адрес и длину первого буфера, в PDC_RNPR и PDC_RNCR - второго.
3. При поступлении прерывания ENDRX копируем данные из буфера PDC в пользовательский (у меня это обычно FIFO, если принимается поток, или набор фиксированных буферов, если обмен идет в пакетном режиме). Адрес и длину освободившегося буфера записываем в PDC_RNPR и PDC_RNCR.
Наличие места в FIFO или свободного буфера на этом этапе - целиком проблема пользовательского приложения.
4. По TIMEOUT все несколько сложнее:
4.1 Запрещаем - увы - прерывания
4.2 Выключаем PDC
4.3 Запоминаем PDC_RCR
4.4 Если PDC_RNCR != 0, то ставим PDC_RPR = PDC_RNPR, PDC_RCR = PDC_RNCR, PDC_RNCR = 0,
в противном случае игнорируем п.4.6
4.5 Включаем PDC и прерывания
4.6 Копируем данные и прописываем PDC_RNPR и PDC_RNCR аналогично п.3
Время запрета PDC и прерываний получается очень малым.