5,6 → 5,7 |
#include <stdio.h> |
|
static UART_DATA uart_1_data; |
static UART_DATA *uart_1_data_p = &uart_1_data; |
|
void UART1_Init() { |
// Configure the hardware USART device |
34,10 → 35,10 |
PIE1bits.RC1IE = 1; // Enable RX interrupt |
|
// Initialize the buffer that holds UART messages |
uart_1_data.buffer_in_read_ind = 0; |
uart_1_data.buffer_in_write_ind = 0; |
uart_1_data.buffer_in_len = 0; |
uart_1_data.buffer_in_len_tmp = 0; |
uart_1_data_p->buffer_in_read_ind = 0; |
uart_1_data_p->buffer_in_write_ind = 0; |
uart_1_data_p->buffer_in_len = 0; |
uart_1_data_p->buffer_in_len_tmp = 0; |
} |
|
//void uart_2_init() { |
62,28 → 63,28 |
c = RCREG1; |
#ifdef UART1_RX_TO_BUFFER |
// Save received data into buffer |
uart_1_data.buffer_in[uart_1_data.buffer_in_write_ind] = c; |
if (uart_1_data.buffer_in_write_ind == MAXUARTBUF - 1) { |
uart_1_data.buffer_in_write_ind = 0; |
uart_1_data_p->buffer_in[uart_1_data_p->buffer_in_write_ind] = c; |
if (uart_1_data_p->buffer_in_write_ind == MAXUARTBUF - 1) { |
uart_1_data_p->buffer_in_write_ind = 0; |
} else { |
uart_1_data.buffer_in_write_ind++; |
uart_1_data_p->buffer_in_write_ind++; |
} |
|
// Store the last MAXUARTBUF values entered |
if (uart_1_data.buffer_in_len_tmp < MAXUARTBUF) { |
uart_1_data.buffer_in_len_tmp++; |
if (uart_1_data_p->buffer_in_len_tmp < MAXUARTBUF) { |
uart_1_data_p->buffer_in_len_tmp++; |
} else { |
if (uart_1_data.buffer_in_read_ind == MAXUARTBUF - 1) { |
uart_1_data.buffer_in_read_ind = 0; |
if (uart_1_data_p->buffer_in_read_ind == MAXUARTBUF - 1) { |
uart_1_data_p->buffer_in_read_ind = 0; |
} else { |
uart_1_data.buffer_in_read_ind++; |
uart_1_data_p->buffer_in_read_ind++; |
} |
} |
|
// Update buffer size upon receiving newline (0x0D) |
if (c == UART1_BREAK_CHAR) { |
uart_1_data.buffer_in_len = uart_1_data.buffer_in_len_tmp; |
uart_1_data.buffer_in_len_tmp = 0; |
uart_1_data_p->buffer_in_len = uart_1_data_p->buffer_in_len_tmp; |
uart_1_data_p->buffer_in_len_tmp = 0; |
} |
#endif |
#ifdef UART1_RX_TO_XBEE |
114,14 → 115,14 |
|
void UART1_Send_Interrupt_Handler() { |
// Put remaining data in TSR for transmit |
if (uart_1_data.buffer_out_ind != uart_1_data.buffer_out_len) { |
TXREG1 = uart_1_data.buffer_out[uart_1_data.buffer_out_ind]; |
uart_1_data.buffer_out_ind++; |
if (uart_1_data_p->buffer_out_ind != uart_1_data_p->buffer_out_len) { |
TXREG1 = uart_1_data_p->buffer_out[uart_1_data_p->buffer_out_ind]; |
uart_1_data_p->buffer_out_ind++; |
} else { |
while (!TXSTA1bits.TRMT); // Wait for last byte to finish sending |
TXSTA1bits.TXEN = 0; // End transmission and disable TX interrupt |
uart_1_data.buffer_out_ind = 0; |
uart_1_data.buffer_out_len = 0; |
uart_1_data_p->buffer_out_ind = 0; |
uart_1_data_p->buffer_out_len = 0; |
} |
} |
|
130,12 → 131,12 |
unsigned char i; |
va_list args; |
va_start(args, fmt); |
vsprintf((char *) uart_1_data.buffer_out, fmt, args); |
vsprintf((char *) uart_1_data_p->buffer_out, fmt, args); |
va_end(args); |
uart_1_data.buffer_out_len = strlen((char *) uart_1_data.buffer_out); |
uart_1_data.buffer_out_ind = 1; |
for (i = 0; i < uart_1_data.buffer_out_len; i++) { |
TXREG1 = uart_1_data.buffer_out[i]; |
uart_1_data_p->buffer_out_len = strlen((char *) uart_1_data_p->buffer_out); |
uart_1_data_p->buffer_out_ind = 1; |
for (i = 0; i < uart_1_data_p->buffer_out_len; i++) { |
TXREG1 = uart_1_data_p->buffer_out[i]; |
Nop(); |
while (!PIR1bits.TX1IF); // Wait for byte to be transmitted |
} |
143,11 → 144,11 |
va_list args; |
while (TXSTA1bits.TXEN); // Wait for previous message to finish sending |
va_start(args, fmt); |
vsprintf((char *) uart_1_data.buffer_out, fmt, args); |
vsprintf((char *) uart_1_data_p->buffer_out, fmt, args); |
va_end(args); |
uart_1_data.buffer_out_len = strlen((char *) uart_1_data.buffer_out); |
uart_1_data.buffer_out_ind = 1; |
TXREG1 = uart_1_data.buffer_out[0]; // Put first byte in TSR |
uart_1_data_p->buffer_out_len = strlen((char *) uart_1_data_p->buffer_out); |
uart_1_data_p->buffer_out_ind = 1; |
TXREG1 = uart_1_data_p->buffer_out[0]; // Put first byte in TSR |
TXSTA1bits.TXEN = 1; // Begin transmission |
#endif |
} |
162,12 → 163,12 |
} |
#else |
while (TXSTA1bits.TXEN); // Wait for previous message to finish sending |
uart_1_data.buffer_out_len = length; |
uart_1_data.buffer_out_ind = 1; |
uart_1_data_p->buffer_out_len = length; |
uart_1_data_p->buffer_out_ind = 1; |
for (i = 0; i < length; i++) { |
uart_1_data.buffer_out[i] = msg[i]; |
uart_1_data_p->buffer_out[i] = msg[i]; |
} |
TXREG1 = uart_1_data.buffer_out[0]; // Put first byte in TSR |
TXREG1 = uart_1_data_p->buffer_out[0]; // Put first byte in TSR |
TXSTA1bits.TXEN = 1; // Begin transmission |
#endif |
} |
179,8 → 180,8 |
while (!PIR1bits.TX1IF); |
#else |
while (TXSTA1bits.TXEN); |
uart_1_data.buffer_out_len = 1; |
uart_1_data.buffer_out_ind = 1; |
uart_1_data_p->buffer_out_len = 1; |
uart_1_data_p->buffer_out_ind = 1; |
TXREG1 = c; |
TXSTA1bits.TXEN = 1; |
#endif |
188,21 → 189,21 |
} |
|
unsigned char UART1_Buffer_Len() { |
return uart_1_data.buffer_in_len; |
return uart_1_data_p->buffer_in_len; |
} |
|
/* Reader interface to the UART buffer, returns the number of bytes read */ |
unsigned char UART1_Read_Buffer(unsigned char *buffer) { |
unsigned char i = 0; |
while (uart_1_data.buffer_in_len != 0) { |
buffer[i] = uart_1_data.buffer_in[uart_1_data.buffer_in_read_ind]; |
while (uart_1_data_p->buffer_in_len != 0) { |
buffer[i] = uart_1_data_p->buffer_in[uart_1_data_p->buffer_in_read_ind]; |
i++; |
if (uart_1_data.buffer_in_read_ind == MAXUARTBUF - 1) { |
uart_1_data.buffer_in_read_ind = 0; |
if (uart_1_data_p->buffer_in_read_ind == MAXUARTBUF - 1) { |
uart_1_data_p->buffer_in_read_ind = 0; |
} else { |
uart_1_data.buffer_in_read_ind++; |
uart_1_data_p->buffer_in_read_ind++; |
} |
uart_1_data.buffer_in_len--; |
uart_1_data_p->buffer_in_len--; |
} |
return i; |
} |