:::


Browsing this Thread:   1 Anonymous Users






Rs232 uart buffer 資料擷取
#1
新會員
新會員


查看用戶資訊
我從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);


}
}

發表於: 2018/7/7 23:39
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Rs232 uart buffer 資料擷取
#2
新會員
新會員


查看用戶資訊
define BUFFER_SIZE設定為8,一開始送77 88 99 11 buffer[1],buffer[2]可以讀到88 99,但如果改送11 22 33 44,要連續送兩次buffer[1],buffer[2]才會變成 22 33

發表於: 2018/7/8 3:46
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Rs232 uart buffer 資料擷取
#3
資深會員
資深會員


查看用戶資訊
不知你怎麼實驗的...

buffer就是buffer而以,
不應直接去讀取固定位置...

亂猜一下
你先傳 77 88 99 11
buffer = [77][88][99][11][*xx][xx][xx][xx]
註: xx代表未知或初始值
* 代表 next_in位置

再傳11 22 33 44
buffer = [*77][88][99][11][11][22][33][44]

再傳11 22 33 44
buffer = [11][22][33][44][*11][22][33][44]
註:這裏就先不討論沒有讀取buffer,buffer滿了,
照成next_in無法移動問題...


buffer只是資料過渡暫存的地方...
所以不應該,也不可以直接讀buffer固定位置...

發表於: 2018/7/10 11:51
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: Rs232 uart buffer 資料擷取
#4
版主
版主


查看用戶資訊
既然使用了 PIC18F45K22 那就有 Ring Buffer 設計的範例可參考。使用 MCC 所產生的 UART 收發都可設定使用 Ring Bufeer 的介面。使用一進一出的指標設計也可以江輸出轉向到 printf( )。

這些使用有教育訓練可以參考,在教育訓練光碟下的"8-Bits MCU 相關課程" 下有一教材"MCC201 v1.00 MCC201 v3.0x MPLAB Code Configurator New!" 下載 v3.0x 版本。參考一下裡面的 Lab3-1看看。

我是懷疑你的存、取指標弄錯了造成資料抓取上的錯誤,這需要用除錯模式來分析找出問題的。

發表於: 2018/7/11 14:00
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]