*/}Para receber dados pela Serial, voce pode ler bytes doregistrador de dados UDR. O processo de recebimento concluido e indicado peloregistrador RXC que e ativado quando existe dados disponiveis na serial.charuart_getchar(void) { loop_until_bit_is_set(UCSRA, RXC); /* Waituntil data exists. */ return UDR;}Redirecionando Fluxo de Dados Para a SerialExiste uma macro chamada FDEV_SETUP_STREAM que pode serusada para configurar um buffer que e valido para operacoes de entrada/saidapadrao. O buffer iniciado deve ser do tipo FILE. Voce pode definir buffers separadospara entrada e para saida. Ou voce pode definir um unico buffer que funcionapara ambos, tanto para entrada como para saida. O primeiro e segundo parametroda funcao recebem os nomes das funcoes a serem chamadas quando data esta paraser lida ou escrita no buffer.Utilizando um buffer separado para cada operacao:FILEuart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);FILEuart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ);Utilizando um buffer unico para entrada e para saida:FILEuart_io = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);Para preparar as nossas funcoes uart_putchar e uart_getchar paraserem usadas com os fluxos de entrada/saida, temos que mudar as definicoes umpouco. voiduart_putchar(char c, FILE *stream) { loop_until_bit_is_set(UCSRA, UDRE); UDR = c;}charuart_getchar(FILE *stream) { loop_until_bit_is_set(UCSRA, RXC); /* Waituntil data exists. */ return UDR;}Agora podemos redirecionar ambos STDIN e STDOUT para aSerial. Isso nos habilita a usar as funcoes de leitura e escrita da AVR Libc.intmain(void) { uart_init(); stdout = &uart_output; stdin = &uart_input; char input; while(1) { puts("Hello world!"); input = getchar(); printf("You wrote %c\n",input); } return 0;}Registradores de Controle e Status UCSRA Bit # Nome Descricao bit 7 RXC USART Recebimento Completo. Ligado quando tem dados disponiveis no registrador de dados que nao foram lidos ainda. bit 6 TXC USART Transmissao Completa. Ligado quando todos os dados foram transmitidos. bit 5 UDRE USART Registro de Dados Vazio. Ligado quando o registrador UDR esta vazio e novos dados podem ser transmitidos. bit 4 FE Erro de Frame. Ligado quando proximo byte no registrador de dados UDR possui erro de frame. bit 3 DOR Dados Atropelados. Ligado quando o registrador UDR nao foi lido antes do proximo frame ter chegado. bit 2 PE USART Erro de Paridade. Ligado quando o proximo frame no registrador UDR possui erro de paridade. bit 1 U2X USART Velocidade Dupla de Transmissao. Quando ligado diminui o tempo de bit pelo dobro da velocidade. bit 0 MPCM Modo de Comunicacao Multi-processamento. Quando ligado os dados recebidos sao ignorados se nao possuirem informacao de endereco. UCSRB Bit # Nome Descricao bit 7 RXCIE RX Ativacao da Interrupcao de Conclusao. Ligue para permitir interrupcao quando recebimento completo. bit 6 TXCIE TX Ativacao da Interrupcao de Conclusao. Ligue para permitir interrupcao quando transmissao completa. bit 5 UDRIE USART Registrador de Dados Vazio com Interrupcao Ativa. Ligue para permitir interrupcao quando registrador de dados vazio. bit 4 RXEN Recebimento Ativo. Ligue para ativar o recebimento. bit 3 TXEN Transmissao Ativa. Ligue para ativar a transmissao. bit 2 UCSZ2 USART Tamanho do Caractere. Utilize em conjunto com UCSZ1 e UCSZ0 para configurar o tamanho do frame. Tamanhos disponiveis sao 5-bit (000), 6-bit (001), 7-bit (010), 8-bit (011) e 9-bit (111). bit 1 RXB8 Receptor do Bit 8 de Dados.