對於串列埠的使用(基於OK6410的串列埠…
阿新 • • 發佈:2019-01-08
這裡對串列埠的使用不在於控制,僅僅在於對字串的列印,以及對鍵盤輸入字元的判斷和操作
在C語言中我們熟用printf和scanf來列印資訊和獲得資訊,在串列埠使用中就要編寫這兩個函式,移植對應函式需要的檔案。有lib資料夾和include資料夾
首先對main函式進行編寫,主要就是對printf,scanf的呼叫來實現選擇型控制檯。
void gboot_main()
{
int num;
int i;
unsigned char temp[4*1024];
#ifdef MMU_ON
mmu_init();
#endif
led_off();
button_init();
irq_init();
uart_init();
while(1)
{
printf("\n\r**********************************\n\r");
printf("\n\r***************GBOOT**************\n\r");
printf("1.download linux kernel from tftp server!\n\r");
printf("2.boot linux from ram!\n\r");
printf("3.boot linux from nand flash!\n\r");
printf("\n please select:");
scanf("%d",&num);
switch (num)
{
case 1:
//tftp_down();
break;
case 2:
//boot_linux_ram();
break;
case 3:
//boot_linux_nand();
break;
default:
printf("error! wrong selection\n\r");
break;
}
}
}
接下來就是實現printf函式,新建printf.c,並且在makefile裡面新增printf.o檔案用來連結
先來看一下printf的格式,用man 3 printf指令可以檢視
這裡可以看出printf格式為int printf(const char *format, ...);這裡的...表示引數個數不確定。在C語言裡printf往往可以顯示變數,用%d,%c,%f等等,但是我們要用以前編寫的putc函式顯示的話,就必須時字元,所以這裡先把要輸出的呢榮全部轉化為字元形式。然後再用putc輪流輸出。 int printf(const char *fmt, ...) { int i; va_list args; //1.將變參轉化為字串 從Linux核心去移植出來用 va_start(args,fmt); //利用format得到變參的列表 vsprintf((char *)outbuf,fmt,args); //把變參轉化成字串 va_end(); //結束轉換 //2.列印字串到串列埠 for(i=0;i { putc(outbuf[i]); } return i; } 這裡面的第一步以及va_list args 無法實現,是因為沒有新增對應需要的檔案,所以接下來就來新增檔案,
往根目錄裡面的makefile修改,新增lib/lib.o來應用資料夾lib下的檔案,
在新增如下
CFLAGS :=-fno-builtin -I$(shell pwd)/include
export CFLAGS
這裡面(shell
pwd)/是自動查詢並應用該目錄的寫法,在輸出CFLAGS
lib/lib.o由lib資料夾下的makefile生成,所以
lib/lib.o :
make -C lib all
執行清除工作
make -C lib clean
這樣,printf函式就可以用了
與此類似,scanf,只不過這裡先讀取字串,再把字串中的數轉化出來
int scanf(const char* fmt, ...)
{
unsigned char c;
int i=0;
va_list args;
//1.獲取輸入字串
while(1)
{
c=getc();
if((c==0x0d)||(c==0x0a))
{
inbuf[i]='\n';
break;
}
else
{
inbuf[i++]=c;
}
}
//2.格式轉換
va_start(args,fmt);
vsscanf((char *)inbuf,fmt,args);
va_end(args);
return i;
}
編寫好scanf和printf之後就是main函式的事了
面函式怎麼設計就很方便了
還有一點與我以前寫C語言程式的不同在於,回車,先看看別人寫的,感覺比較清楚
看完後就會發現為什麼換行要加\n\r,這裡與以前C語言不同,因為是串列埠傳送,實際是傳送ASCII碼,所以。。。。
得到的結果就是
這裡可以看出printf格式為int printf(const char *format, ...);這裡的...表示引數個數不確定。在C語言裡printf往往可以顯示變數,用%d,%c,%f等等,但是我們要用以前編寫的putc函式顯示的話,就必須時字元,所以這裡先把要輸出的呢榮全部轉化為字元形式。然後再用putc輪流輸出。 int printf(const char *fmt, ...) { int i; va_list args; //1.將變參轉化為字串 從Linux核心去移植出來用 va_start(args,fmt); //利用format得到變參的列表 vsprintf((char *)outbuf,fmt,args); //把變參轉化成字串 va_end(); //結束轉換 //2.列印字串到串列埠 for(i=0;i { putc(outbuf[i]); } return i; } 這裡面的第一步以及va_list args