初级会员

- 积分
- 196
- 金钱
- 196
- 注册时间
- 2011-8-12
- 在线时间
- 6 小时
|
网上讲的添加printf()到程序中一般都是这样:
1.配置GPIO ,USART,RCC 的Configuration
2.勾选usb micro lib
3.在程序中添加 头文件需要添加#include <stdio.h>)
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1, (u8) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
很明显这个方法使用printf()只能输出到usart1,如果需要使用多个usart呢,肯定不能都是用printf()。
方法如下是继续是用usart2的printf()功能:
1.配置usart2的串口配置,gpio,rcc enable,跟上面类似
2.勾选usb micro lib,跟上面类似
3.添加头文件#include <stdarg.h>,编写USART2的printf函数:
void USART2_printf (char *fmt, ...)
{
char buffer[CMD_BUFFER_LEN+1]; // CMD_BUFFER_LEN长度自己定义吧
u8 i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, CMD_BUFFER_LEN+1, fmt, arg_ptr);
while ((i < CMD_BUFFER_LEN) && buffer)
{
USART_SendData(USART2, (u8) buffer[i++]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
va_end(arg_ptr);
}
用法与printf类似,如int i=123;USART2_printf("%d",i);
如果需要使用USART3,USART4......的printf()函数自以此类推! |
关于void USART2_printf (char *fmt, ...)的问题,我这样做是实现了多串口打印了,但是 CMD_BUFFER_LEN长度 我不知道怎么实现自动获取,比如我发送 “你妹”,CMD_BUFFER_LEN长度只能自己改成4。也不能在函数里面增加入口参数了,否则编译不通过。望原子后者各位有经验的大哥指点迷津。谢谢! |
|