PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

回應
 
主題工具
booger
Amateur Member
 
booger的大頭照
 

加入日期: 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
     
      
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒)
挑嘴不挑食(對飲食頗有想法但是有得吃就吃)
舊 2009-08-01, 09:03 AM #1
回應時引用此文章
booger離線中  
kindalo
Silent Member
 

加入日期: Dec 2001
文章: 0
Interrupt ??
 

此文章於 2009-08-01 09:37 AM 被 kindalo 編輯.
舊 2009-08-01, 09:33 AM #2
回應時引用此文章
kindalo離線中  
13F
*停權中*
 

加入日期: Feb 2004
文章: 255
引用:
作者booger

但是如果寫成
*ch=SBUF;
uart_write_char(*ch);
就會讀到NAK(0x15)



*ch=SBUF;// 設定ch的位址=SBUF內容值.
uart_write_char(*ch);//肯定列印出一堆奇怪東西.

丁丁大學果然人材擠擠.
舊 2009-08-01, 10:21 AM #3
回應時引用此文章
13F離線中  
阿宅
*停權中*
 
阿宅的大頭照
 

加入日期: Dec 2006
您的住址: 大鵰村
文章: 12
改成這樣看看(多此一舉的寫法... )...

in=SBUF;
*ch=in;
uart_write_char(*ch);


Keil有支援指標,但是有時會錯...
改用IAR吧!!!寫多工時很好用(但是51不適合多工 )...

此文章於 2009-08-01 11:00 AM 被 阿宅 編輯.
舊 2009-08-01, 10:59 AM #4
回應時引用此文章
阿宅離線中  
booger
Amateur Member
 
booger的大頭照
 

加入日期: Nov 2004
您的住址: 丁丁科技大學
文章: 45
引用:
作者阿宅
改成這樣看看(多此一舉的寫法... )...
in=SBUF;
*ch=in;
uart_write_char(*ch);


嗯...錯誤,
Debug 2小時終於確認問題了...


引用:
作者阿宅
Keil有支援指標,但是有時會錯...





引用:
作者阿宅
改用IAR吧!!!寫多工時很好用(但是51不適合多工 )...


謝謝你,我試試看
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒)
挑嘴不挑食(對飲食頗有想法但是有得吃就吃)
舊 2009-08-01, 11:17 AM #5
回應時引用此文章
booger離線中  
booger
Amateur Member
 
booger的大頭照
 

加入日期: Nov 2004
您的住址: 丁丁科技大學
文章: 45
引用:
作者13F
*ch=SBUF;// 設定ch的位址=SBUF內容值.
uart_write_char(*ch);//肯定列印出一堆奇怪東西.

丁丁大學果然人材擠擠.





還是不懂哪裡錯了

代碼:
void uart_read_char(char *ch){
        ...
	*ch=SBUF;
	uart_write_char(*ch);
}
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒)
挑嘴不挑食(對飲食頗有想法但是有得吃就吃)
舊 2009-08-01, 11:33 AM #6
回應時引用此文章
booger離線中  
booger
Amateur Member
 
booger的大頭照
 

加入日期: Nov 2004
您的住址: 丁丁科技大學
文章: 45
引用:
作者kindalo
Interrupt ??


對齁


不過interrupt function的sign為 void FUNC(void) interrupt NO(),
這下得refactoring囉...
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒)
挑嘴不挑食(對飲食頗有想法但是有得吃就吃)
舊 2009-08-01, 11:53 AM #7
回應時引用此文章
booger離線中  
geminiz
Major Member
 
geminiz的大頭照
 

加入日期: Jul 2001
您的住址: 西湖國小
文章: 125
引用:
作者booger
還是不懂哪裡錯了


void uart_read_char(char *ch){
...
*ch=SBUF;
uart_write_char(*ch);
}


"*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了..好像是這樣
舊 2009-08-01, 12:34 PM #8
回應時引用此文章
geminiz離線中  
booger
Amateur Member
 
booger的大頭照
 

加入日期: 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());
}


這樣就正常工作了。
不過有點土法煉鋼就是了,如果中斷的方式比較正規
__________________
動怒不動氣(對不滿的事情表達不悅,但是不讓其過份影響個人情緒)
挑嘴不挑食(對飲食頗有想法但是有得吃就吃)
舊 2009-08-01, 01:05 PM #9
回應時引用此文章
booger離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是11:01 AM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。