Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 127 → Rev 128

/PIC Stuff/PIC_27J13/uart.c/uart.c
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;
}