Este artigo vai para quem utiliza as placas do Arduino paradesenvolvimento de hardware, mas que nao gosta muito sao das bibliotecas doArduino. Pois elas oferecem apenas encapsulamentos sobre as funcoes do AVRLibc, ou entao apenas reescrevem as funcoes que a Libc ja provem. Comunicacao Serial e um bom exemplo disso. O Arduino fornecesua propria implementacao de funcoes como Serial.print(), Serial.println() eSerial.read(). Ao mesmo tempo a AVR Libc ja prove funcoes como printf(), puts()e getchar(). Este artigo explica quao facil e implementar essas funcoes da Libcna comunicacao Serial da plataforma megaAVR da Atmel.Se voce nao possui muita experiencia em programacao e melhorprovavelmente voce continuar usando as bibliotecas do Arduino. Elas sao boas emesconder as caracteristicas mais complicadas da programacao embarcada.Entretanto voce deve migrar enquanto amadurece no desenvolvimento dos seusprojetos. Os datasheets da Atmel nao sao tao complicados como parecem deinicio. E voce deve estudar tambem o codigo pronto deste artigo.Configurando UARTMicrocontroladores AVR possuem tres registradores decontrole e de status. O registrador UCSRA normalmente contem dos dados destatus. Ja os registradores UCSRB e UCSRC contem os conjuntos de configuracoes.Veja as tabelas no fim deste artigo para conhecer todos os possiveis valores.A AVR Libc fornece macros auxiliares para calculos de baudrate, incluindo em um arquivo de cabecalho chamado setbaud.h, que precisa queas macros F_CPU e BAUD sejam definidas. Ao incluir esse arquivo de cabecalho,as macros UBRRL_VALUE, UBRRL_VALUE e USE_2X sao definidas. As duas primeirassao usadas para configurar a velocidade da Serial. A ultima e usada paradeterminar se a Serial deve ser configurada para rodar no dobro da velocidade,dado um determinado baud rate.UCSZ2, UCSZ1 e UCSZ0 sao registradores que controlam otamanho dos dados. Sao possiveis as configuracoes de 5-bit (000), 6-bit (001),7-bit (010), 8-bit (011) e 9-bit (111). A mais comum e o tamanho de 8-bit. Oformato mais conhecido e utilizado de comunicacao Serial e o 8N1, ou seja,8-bit, sem paridade e com 1-bit de parada. O que configura o bit de parada para1-bit e o registrador USBS. E os registradores que configuram o modo deparidade sao os UPM1 e UPM0. Para o modo 8N1 basta nao configurar nada nessesregistradores, ou seja, ambos precisam ser zero para desativar a paridade.Utilizando os bits ensinados acima, podemos entao configurara Serial:#defineF_CPU 16000000UL#defineBAUD 9600#include <util/setbaud.h>voiduart_init(void) { UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE;#if USE_2X UCSRA |= _BV(U2X);#else UCSRA &= ~(_BV(U2X));#endif UCSRC = _BV(URSEL) | _BV(USBS) | _BV(UCSZ1)| _BV(UCSZ0); // format 8N1 UCSRB = _BV(RXEN) | _BV(TXEN); /* Enable RX and TX */}Lendo e Escrevendo na SerialVoce pode transmitir dados pela Serial escrevendo bytes noregistrador de dados UDR. Primeiro voce deve certificar que a Serial estapronta para transmitir novos dados (ou seja, que ja transmitiu os dadosanteriores). Aqui voce tem duas opcoes, esperar que o registrador dedados vazios UDRE seja ativado, ou voce pode, apos o envio de cada byte,esperar a confirmacao da transmissao, atraves do registrador de transmissaocompletada TXC, que e ativado quando a transmissao foi concluida.Opcao 1, atraves do registrador UDRE:voiduart_putchar(char c) { loop_until_bit_is_set(UCSRA, UDRE); /* Waituntil data register empty. */ UDR = c;}Opcao 2, atraves do registrador TXC:voiduart_putchar(char c) { UDR = c; loop_until_bit_is_set(UCSRA, TXC); /* Waituntil transmission ready.