會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





Rs232 uart buffer 資料擷取
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 16
等級: 2; EXP: 74
HP : 0 / 43
MP : 5 / 765
離線
我從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);


}
}

7月07日 23:39:28
轉換PDF檔 列印


Re: Rs232 uart buffer 資料擷取
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 16
等級: 2; EXP: 74
HP : 0 / 43
MP : 5 / 765
離線
define BUFFER_SIZE設定為8,一開始送77 88 99 11 buffer[1],buffer[2]可以讀到88 99,但如果改送11 22 33 44,要連續送兩次buffer[1],buffer[2]才會變成 22 33

7月08日 03:46:11
轉換PDF檔 列印


Re: Rs232 uart buffer 資料擷取
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 983
等級: 27; EXP: 79
HP : 0 / 669
MP : 327 / 21777
離線
不知你怎麼實驗的...

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]
註:這奡N先不討論沒有讀取buffer,buffer滿了,
照成next_in無法移動問題...


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

7月10日 11:51:01
轉換PDF檔 列印


Re: Rs232 uart buffer 資料擷取
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14388
等級: 72; EXP: 88
HP : 1078 / 1797
MP : 4796 / 74676
離線
既然使用了 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看看。

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

7月11日 14:00:21
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project