对于串口的使用(基于OK6410的串口…

本文档详细介绍了如何在基于OK6410的系统中实现串口的printf和scanf功能,包括对main函数的编写,printf和scanf函数的实现,以及相关文件的添加和编译配置。通过移植Linux内核的函数,将变参转化为字符串并输出到串口。
摘要由CSDN通过智能技术生成
这里对串口的使用不在于控制,仅仅在于对字符串的打印,以及对键盘输入字符的判断和操作

在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的串口驱动)


lib下载: lib文件夹
include下载: include文件夹
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值