OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5772|回复: 2

问一下原子大哥以及各位高手一个多串口PRINTF的问题。

[复制链接]

16

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2011-8-12
在线时间
6 小时
发表于 2013-7-29 16:00:34 | 显示全部楼层 |阅读模式
网上讲的添加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。也不能在函数里面增加入口参数了,否则编译不通过。望原子后者各位有经验的大哥指点迷津。谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-29 17:10:09 | 显示全部楼层
回复【楼主位】SEASON3:
---------------------------------
定义一个最大需求的buf,然后作为全局变量,供各个串口使用.
我们的例程:
//串口2,printf 函数
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
void u2_printf(char* fmt,...)  
{  
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成   
UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF));  //通过dma发送出去
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-8-11 09:14:12 | 显示全部楼层
mark下,以后用到
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 04:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表