这几天在调试无线通信程序时,在调试时出了问题,程序中直接调用printf("...");就可以通过串口在超级终端上显示。
我觉得这个很神奇,就上网查了一些资料。原来,printf()函数是标准c库的一个函数(这个大家早就知道),它的实现很复杂,在这里我就不讲了,感兴趣的朋友可以看这篇文章http://blog.tianya.cn/blogger/post_show.asp?BlogID=462085&PostID=8363874 ,反正最后它是利用系统调用将格式好的数据送到标准输入输出设备,但是很多嵌入式设备上没有标准输入输出设备,通常都是串口。那么,为了让嵌入式设备也可以用printf(),我们可以在编译的时候调用缺省的c库,然后重写一下这两个函数:
//发送数据
int putchar (int c)
{
__io_putchar((char) c);//自定义的输出字符函数
return c;
}
// 接收数据
int GetKey (void) {
_IO_getKey((char) c);//自定义的输入函数
return c;
}
这相当于最后printf()调用的是这两个函数。你就可以随心所欲的让printf()函数为你所用了,当然,如果读者嫌麻烦,也可以直接调用sprint();函数。
那么,怎么设置缺省的C库呢,http://blog.sina.com.cn/s/blog_8f6fade701013ep4.html 这是KEIL工程里的设置,我也不说了。
下面我就说下,如何用IAR编译器设置printf()函数,找到Project-》Options-》General Options —》 Library Options,设置如下即可: