【C语言】MCU系统printf函数重写以及fputc重定向

重写printf函数参考:51单片机之printf

//将stdio.h头文件中的printf函数注释掉不然会冲突
//stdio.h头文件还是要包含的里面有va_list的定义
//使用vsprintf将要打印的数据赋给字符串
//使用字符串发送函数发送字符串

//不要把这个数组放在printf函数里面,一方面会在栈分配内存上耗费时间
//另一方面也是最主要的如果栈空间不够了还要分配100个字节那就会导致
//堆栈溢出,CC2530使用256字节的IDATA的一部分作为栈空间,我设置成了0xC0
//也就是192字节,在函数调用层次很深的时候在调用printf函数就会很容易
//导致堆栈溢出,出现莫名其妙的问题。
char string[100];
void printf(char *fmt,...)
{
    va_list ap;                	//typedef char *va_list; va_list是char型的指针
    va_start(ap,fmt);        	//这个函数的功能是,找到第一个可变形参的地址,并把地址赋给ap
    vsprintf(string,fmt,ap);	//其实这个函数才是核心函数,没研究。。。
    UartSendString(string);    	//这个函数就是发送字符串函数,通过上一个函数,就把该提取的东西都提取了
    va_end(ap);                	//结束函数
}

其实使用sprintf/snprintf函数就可以实现printf功能了,例如:

sprintf(string,fmt,...);
UartSendString(string);

还可以用逗号表达式简化上面的语句:

UartSendString((sprintf(string,fmt,...), string));

如果坚持使用系统的printf函数,可以将fputc函数重写,使用串口或者其它方式进行数据打印,如果定义了__GNUC__,说明使用GCC编译器,GCC的C标准库使用的底层好像是__io_putchar函数,所以需要重写__io_putchar函数。

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值