I use interrupt driven circular buffer to received data from UART. But few characters was losed sometimes.
It's serious problem on my system. Could anyone give me some suggests?
__interrupt void uart1_Rxd_ISR(void)
{
switch (__even_in_range(UCA1IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
if (Device.uart1_index == 1 && Uart1.write == Uart1.read)
{
if (UCA1RXBUF == '\n') Uart1.buffer[Uart1.write] = UCA1RXBUF;
}
else
{
Device.uart1_index = 1;
Uart1.write = inc_uart1_buffer_size(Uart1.write);
Uart1.buffer[Uart1.write] = UCA1RXBUF;
}
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
void uart1_process(void) //in main while loop
{
int i,j;
char *cmd_buf=(char *)malloc(sizeof(char)*uart1_buffer_size+1);
UCA1IE &= ~UCRXIE; //Disable USART1 RX interrupt
if (Device.uart1_index == 0 && Uart1.write == Uart1.read) UCA1IE |= UCRXIE; //Enable USART1 RX interrupt
else
{
Device.uart1_index = 0;
Uart1.read = inc_uart1_buffer_size(Uart1.read);
UCA1IE |= UCRXIE; //Enable USART1 RX interrupt
if (Uart1.buffer[Uart1.read] == '\n')
{
//process that cmd_buf[]
Uart1.head = inc_uart1_buffer_size(Uart1.read);
i = Uart1.read;
j = uart1_buffer_size;
while (j--)
{
i = dec_uart1_buffer_size(i);
if (Uart1.buffer[i]=='\n') break;
};
if (j != 0)
{
for (j=0,i=inc_uart1_buffer_size(i);Uart1.buffer[i]!='\n' && j<uart1_buffer_size-1;j++,i=inc_uart1_buffer_size(i))
{
cmd_buf[j] = Uart1.buffer[i];
}
cmd_buf[j] = Uart1.buffer[i];
cmd_buf[++j] = 0x00;
}
else
{
i = Uart1.read;
i = inc_uart1_buffer_size(i);
Uart1.buffer[i] = '\n';
}
}
}
free(cmd_buf);
}