1. 程式人生 > >對於串列埠的使用(基於OK6410的串列埠…

對於串列埠的使用(基於OK6410的串列埠…

這裡對串列埠的使用不在於控制,僅僅在於對字串的列印,以及對鍵盤輸入字元的判斷和操作 在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指令可以檢視 對於串列埠的使用(基於OK6410的串列埠驅動)
這裡可以看出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碼,所以。。。。 得到的結果就是
對於串列埠的使用(基於OK6410的串列埠驅動)