![]() |
||
|
Amateur Member
![]() 加入日期: Nov 2004 您的住址: 丁丁科技大學
文章: 45
|
請教Keli C語法和UART I/O的問題
我把UART I/O的程式模組化了,
可是在輸出的時候遇到亂碼的情況, 程式如下: 代碼:
void uart_read_char(char *ch){ //這是從UART讀一個char的副程式
char in;
REN=1;
while(RI!=1);
RI=0;
//in=SBUF;
//uart_write_char(in);
*ch=SBUF; //這樣寫出就會 NAK(0x15)的亂碼
uart_write_char(*ch); //從UART寫一個char,在這呼叫因為在debug
}
目前的問題就是,如果寫成 in=SBUF; uart_write_char(in); 就可以正確的輸出輸入(用軟體終端機測試) 但是如果寫成 *ch=SBUF; uart_write_char(*ch); 就會讀到NAK(0x15) 難道Keli C不支援指標傳遞嗎? 主程式: 代碼:
#ifdef TEST_UART
void main(){
char keyin;
uart_init(UART_MODE_1,BUAT_RATE_9600);
while(1){
uart_read_char(&keyin);
}
}
#endif
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒), 挑嘴不挑食(對飲食頗有想法但是有得吃就吃) |
|||||||
|
|
|
Silent Member
加入日期: Dec 2001
文章: 0
|
Interrupt ??
此文章於 2009-08-01 09:37 AM 被 kindalo 編輯. |
||
|
|
|
*停權中*
加入日期: Feb 2004
文章: 255
|
引用:
*ch=SBUF;// 設定ch的位址=SBUF內容值. uart_write_char(*ch);//肯定列印出一堆奇怪東西. 丁丁大學果然人材擠擠. ![]() |
|
|
|
|
*停權中*
加入日期: Dec 2006 您的住址: 大鵰村
文章: 12
|
改成這樣看看(多此一舉的寫法...
)...in=SBUF; *ch=in; uart_write_char(*ch); Keil有支援指標,但是有時會錯... 改用IAR吧!!!寫多工時很好用(但是51不適合多工 )...此文章於 2009-08-01 11:00 AM 被 阿宅 編輯. |
|
|
|
Amateur Member
![]() 加入日期: Nov 2004 您的住址: 丁丁科技大學
文章: 45
|
引用:
嗯...錯誤, Debug 2小時終於確認問題了... 引用:
引用:
謝謝你,我試試看
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒), 挑嘴不挑食(對飲食頗有想法但是有得吃就吃) |
|||
|
|
|
Amateur Member
![]() 加入日期: Nov 2004 您的住址: 丁丁科技大學
文章: 45
|
引用:
還是不懂哪裡錯了 代碼:
void uart_read_char(char *ch){
...
*ch=SBUF;
uart_write_char(*ch);
}
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒), 挑嘴不挑食(對飲食頗有想法但是有得吃就吃) |
|
|
|
|
Amateur Member
![]() 加入日期: Nov 2004 您的住址: 丁丁科技大學
文章: 45
|
引用:
對齁 不過interrupt function的sign為 void FUNC(void) interrupt NO(), 這下得refactoring囉...
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒), 挑嘴不挑食(對飲食頗有想法但是有得吃就吃) |
|
|
|
|
Major Member
![]() 加入日期: Jul 2001 您的住址: 西湖國小
文章: 125
|
引用:
"*ch=SBUF" ch is pointing to SBUF which I assume is a memory-mapped register mapped to the output of the UART input buffer. Once you read it the buffer pushes out the valid data, so the output now is the next item in the buffer (invalid data?) uart_write_char(*ch) then obviously ends up writing the wrong value. 我很久沒寫embedded c了..好像是這樣 |
|
|
|
|
Amateur Member
![]() 加入日期: Nov 2004 您的住址: 丁丁科技大學
文章: 45
|
改了一下寫法,
read UART副程式的prototype由pass by address value改成return char void main(){ uart_init(UART_MODE_1,BUAT_RATE_9600); uart_write_char(uart_read_char()); } 這樣就正常工作了。 不過有點土法煉鋼就是了,如果中斷的方式比較正規
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒), 挑嘴不挑食(對飲食頗有想法但是有得吃就吃) |
|
|