Ipagano,
Tua UART/USART por um acaso opera em modo IrDA? Os módulos infra-vermelho pra IrDA tem praticamente as mesmas propriedades dos receptores/transmissores de rf (não confundir com os módulos IR usados em controle-remoto, os receptores destes usam uma portadora de 30 e poucos khz e já fazem a demodulação pra você).
O modo IrDA basicamente usa codificação por largura de pulso, e o que tenho ouvido a respeito é que o pessoal anda é metendo ao invés de infravermelho, um tx (e na outra ponta um rx) de rf desses comuns. Do ponto de vista do software, a UART continua operando exatamente da mesma forma, basta habilitar o modo IrDA e ela já codifica o bitstream de acordo (talvez até já faça um preâmbulo e tudo mais), no lado receptor você faz a mesma coisa.
Marcelo, sobre usar correção de erro, é uma boa, mas em cima da modulação adequada: o problema não é só não confundir o ruído com dados válidos, mas também conseguir pegar os dados válidos e nesses receptores nojentos em ambiente com relação sinal/ruído complicadas, é difícil filtrar o que é ruído e o que é sinal. Com a largura de pulso dá pra fazer certas brincadeiras, por exemplo, você manda como um preâmbulo uma cadeia PWM com duty cycle conhecido (50-50, 25-75, etc) e duração conhecida, isto ajuda o AGC a se achar e também te dá uma base de tempo pra calibrar a recepção dos próximos pulsos. Desta forma quando você recebe pulsos muito estreitos ou fora do "clock" você ignora, e em alguns casos consegue extrair o bitstream correto mesmo quando tem algum ruído já na saída digital do receptor.
Em cima disto dá pra botar hamming-code ou o que a imaginação ajudar em termos de detecção e/ou correção de erros. Só não vale dizer pro cara implementar reed-solomon num PIC
