Rs232 uart buffer 資料擷取

作者 kckckcrt 於 2018年07月07日 23:39:28
我從rs232 輸入4個16進位數字分別為77 88 99 11,
我要將88,99這兩個數字提出來做運算,
目前問題buffer[1],buffer[2],持續傳送會印出來會變成
11 77 11 77 11 77 77 88 77 88 77 88 88 99 88 99 88 99 99 11 99 11 99 11 這樣循環,77 88 99 11輸入後會出現77 88 77 88 77 88 6組一樣數字,但我只需要出現一組正確的88 99,進行後續運算
還是說要輸入完一次77 88 99 11,要清空buffer,我清過好像也是一樣,不知道是不是我的清法錯誤
我是用CCS 編譯器

#define BUFFER_SIZE 4

#include <18F45k22.h>
#fuses NOMCLR INTRC_IO
#use delay(clock = 8000000)
#use rs232(baud=9600, parity=N,stop=1,xmit=PIN_C6,rcv=PIN_C7,bits=8, errors,STREAM=STREAM_UART)
#include <lcd.c>
char buffer[BUFFER_SIZE];
int8 next_in = 0;
int8 next_out = 0;
int8 count=0;
//==========================
#int_rda
void serial_isr(void)
{
int8 t;

buffer[next_in]=fgetc(STREAM_UART);
t=next_in;
if (++next_in==BUFFER_SIZE)
next_in=0;
if (next_in==next_out)
next_in=t; // Buffer full - throw oldest char
else
++count;
}

#define bkbhit (count!=0)

char bgetc(void)
{
char c;
while(!bkbhit)
;
c=buffer[next_out];
if (++next_out==BUFFER_SIZE)
next_out=0;
count--;
return(c);
}
void main(){
setup_oscillator(OSC_8MHZ); // Set internal oscillator to 8MHz
//========================
enable_interrupts(int_rda);
enable_interrupts(global);
//=======================
while(true)
{
while (bkbhit)
{

printf(lcd_putc,"%X",bgetc());
printf("%c%c",buffer[1],buffer[2]);
}
delay_ms(1000);


}
}

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=1&topic_id=22348&post_id=78356