Ничего не понял из вашего сообщения, но на всякий случай скажу что работать с 9-битными посылками можно. И именно через parity.
вот вам пример
CODE
/* Модуль UART3 */
#include <LPC23xx.H>
#include <rtl.h>
#include "global.h"
#include "uart3.h"
#include "irq.h"
// указатель на mailbox для UART3 модуля
u32* uart3_mbx;
/* Обработчик прерывания UART3 */
void uart3_isr (void) __irq
{
u32 tmp = U3LSR;
tmp = ((tmp & 0x04) << 6) + U3RBR;
if (isr_mbx_check(uart3_mbx) != 0) isr_mbx_send(uart3_mbx, (void*)tmp); // если uart3_mbx не переполнен послали в uart2_mbx принятый байт и четность
VICVectAddr = 0; // завершили прерывание
}
/* Функция инициализации UART3 */
/* Параметры : baudrate - скорость обмена */
/* Результат : mailbox - указатель на ящик обмена */
void uart3_init(u32 baudrate, u32* mailbox)
{
uart3_mbx = mailbox; // сохранили указатель на mailbox
PINSEL0 &= ~((u32)3 << 0);
PINSEL0 |= (u32)2 << 0; // P0.0 включен как TXD3
PINSEL0 &= ~((u32)3 << 2);
PINSEL0 |= (u32)2 << 2; // P0.1 включен как RXD3
U3LCR = 0x2B; // 8 бит, с четностью = 1, 1 стоп бит
U3LCR |= 0x80; // установили DLAB
U3DLM = ((PCLK / 16) / baudrate) / 256; // установили baudrate
U3DLL = ((PCLK / 16) / baudrate) % 256;
U3LCR &= ~0x80; // сбросили DLAB
U3FCR = 0x07; // разрешаем и сбрасываем TX и RX FIFO
set_irq_isr(UART3_INT, (void *)uart3_isr, 0); // установка вектора прерывания UART2
U3IER = UART_IER_RBR; // разрешили прерывания по приему
}
/* Функция передачи блока данных по UART2 */
/* Параметры : data - передаваемый байт данных */
/* nine - девятый бит данных */
void uart3_send (u08 data, u08 nine)
{
if (nine) U3LCR = 0x2B;
else U3LCR =0x3B;
U3THR = data; // передача данных из буфера
while (!(U3LSR & UART_LSR_TEMT)); // ожидание завершения текущей передачи
}
На работу с OS не обращайте внимания