AS5043-Encoder/firmware/lib/uart.c

69 lines
1.3 KiB
C

#include "uart.h"
uint8_t uart_timed_out = 0;
void uart_init(void) {
*uart_ubrrh = UBRR_VAL >> 8; //Setting baudrate
*uart_ubrrl = UBRR_VAL & 0xFF;
*uart_ucsrb |= uart_txen | uart_rxen; // uart rx and tx enable
*uart_ucsrc = uart_ucsz; // Asynchronous 8N1
// flush receive buffer
do
{
*uart_udr;
}
while (*uart_ucsra & uart_rxc);
//reset tx and rx completeflags and udr empty flag
*uart_ucsra = uart_rxc | uart_txc | uart_udre;
}
uint8_t uart_getc_timeout(void) {
uint8_t retries = UART_TIMEOUT;
uint8_t delays = 0;
while (!(*uart_ucsra & uart_rxc) && (retries > 0)) {
if(delays == 0) {
retries--;
}
delays = (delays + 1) % 250;
_delay_us(4);
}
if(retries > 0) {
uart_timed_out = 0;
return *uart_udr;
}
uart_timed_out = 1;
return 0;
}
uint8_t uart_get_line(char buffer[], uint8_t maxlen) {
char t = 0;
uint8_t pos = 0;
buffer[0] = 0;
//maxlen needs to be at least big enough for one character + null byte.
if(maxlen < 2) {
return 0;
}
uart_clear_time_out();
while(pos < maxlen && t != '\n' && !uart_has_timed_out()) {
t = uart_getc_timeout();
buffer[pos] = t;
pos++;
}
// We passed the loop at least once, so pos can not be 0
if(buffer[pos-1] != '\n') {
return 0;
}
buffer[pos-1] = 0;
return 1;
}