这里对串口的使用不在于控制,仅仅在于对字符串的打印,以及对键盘输入字符的判断和操作
这里可以看出printf格式为int printf(const char *format, ...);这里的...表示参数个数不确定。在C语言里printf往往可以显示变量,用%d,%c,%f等等,但是我们要用以前编写的putc函数显示的话,就必须时字符,所以这里先把要输出的呢荣全部转化为字符形式。然后再用putc轮流输出。
在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码,所以。。。。
得到的结果就是
lib下载:
lib文件夹
include下载:
include文件夹