Estoy tratando de aprender a usar la interfaz USART en un Atmega328p. Por ahora, solo trato de enviar bytes de caracteres 'c' cada 500 ms y leerlos en mi computadora usando un convertidor TTL de serie USB PL2303.
Los datos se transmiten, pero no obtengo el resultado que quiero en el lado receptor.
Esto es lo que he programado en mi microcontrolador:
#define BAUDRATE 9600
#define BAUD (((F_CPU / (BAUDRATE * 16UL))) - 1)
void uart_init()
{
UBRR0 = BAUD;
/* 8 data bites, no parity, one stop bit */
UCSR0C |= _BV(UCSZ01) | _BV(UCSZ00);
/* Enable UART input and output */
UCSR0B |= _BV(RXEN0) | _BV(TXEN0);
}
int main()
{
uart_init();
for (;;)
{
while ((UCSR0A & _BV(UDRE0)) == 0);
UDR0 = 'c';
_delay_ms(500);
}
}
Leí los datos en python usando pyserial:
import serial
with serial.Serial(
'/dev/ttyUSB0',
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE) as port:
while True:
print(port.read())
De alguna manera tengo el resultado correcto. Tengo algunos bytes correctos 'c', pero uno de los dos es '\ xe3':
b'\xe3'
b'c'
b'\xe3'
b'c'
b'\xe3'
b'\xe3'
b'\xe3'
b'c'
b'c'
b'c'
b'\xe3'
Parece que tengo un byte de orden alto aleatorio que aparece de vez en cuando.
No puedo encontrar dónde está mi problema. Verifico el alcance, y los datos enviados son siempre los mismos. Así que creo que tengo algo mal en el lado receptor. Pero no puedo encontrar lo que puede ser. He verificado dos veces la F_CPU, que está a 1Mhz.