69 lines
1.3 KiB
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;
|
|
}
|