OpenEdv-开源电子网

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

请问如何在USART3上使用printf函数?

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-8-10
在线时间
0 小时
发表于 2013-8-10 20:54:54 | 显示全部楼层 |阅读模式
求原子哥与大神帮助啊~
我需要在USART3上用printf函数向外输出数据,串口1和串口2我都已经使用了,所以要用串口3,直接改串口1的printf的设置为串口3;但发现串口3用printf不好使啊,用硬件仿真时没有反应,执行到printf那里就不动了。
可能是串口3使用printf与串口1不同,可是我不知道怎么弄,希望能给与帮助呀~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-10 21:27:34 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-8-10
在线时间
0 小时
 楼主| 发表于 2013-8-10 21:37:05 | 显示全部楼层
我就是把对应的GPIOA改为GPIOB的,还有换为对应的引脚。再就是改了fputc函数(把USART1改为USART3了


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-10 21:46:42 | 显示全部楼层
看上去OK啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-8-10
在线时间
0 小时
 楼主| 发表于 2013-8-11 09:53:28 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
可是就是在printf那里没有反应。在网上找答案,见过有说:printf只能用在串口1上,而用在串口2,3时,就要修改printf的底层代码了,写个新的printf函数,如USART2_printf()。可是不知道这个底层怎么改啊~~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-11 09:57:49 | 显示全部楼层
回复【5楼】Aningsk:
---------------------------------
可以的,任何一个串口都可以映射到PRINTF,你说在printf死机了,那检查下是死在哪里?然后看看串口3的寄存器配置,就能找出问题了.
至于冲定义printf也很简单,下面给你个例子:
//串口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发送出去
}
这就是我们例程(GSM模块例程/蓝牙例程等)里面的串口2的printf实现,很简单,用了dma,如果你不想用dma,就把DMA部分做成while发送就是了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-8-10
在线时间
0 小时
 楼主| 发表于 2013-8-11 10:05:52 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
好的~我去试一下!
回复 支持 反对

使用道具 举报

20

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-8-1
在线时间
0 小时
发表于 2014-4-18 13:11:55 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,假如我在串口3重定义了fput,使用了printf,是不是要把串口1的重定义fput删掉?
假如不用删的话,那printf是输出串口1的还是串口3的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-18 20:35:25 | 显示全部楼层
回复【8楼】Carlos:
---------------------------------
只能有一个fputc。
你这里面的东西是串口几,就会发送到串口几。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-12-6
在线时间
24 小时
发表于 2014-7-16 10:44:47 | 显示全部楼层


原子哥,u2_printf不用DMA传输的话,应该怎么改啊?
[mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]//串口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发送出去 }[/mw_shl_code]

我改的贴在下边了,改好之后,我u2_printf("OK"),结果却发到串口调试助手的却不是OK。

[mw_shl_code=c,true]void u2_printf(char* fmt,...) { va_list ap; va_start(ap,fmt); vsprintf((char*)myUsart2.TxBuf,fmt,ap); va_end(ap); while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET); // USART_SendData(USART2,(const char*)myUsart2.TxBuf); USART_SendData(USART2,strlen((const char*)myUsart2.TxBuf)); }[/mw_shl_code]

下边是串口调试助手的截图:



请原子哥指点迷津,谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-16 23:28:17 | 显示全部楼层
将dma哪里,改成一个while/for循环,循环发送完就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-12-6
在线时间
24 小时
发表于 2014-7-17 09:01:38 | 显示全部楼层
改成while或者for循环,都需要一个判断条件啊,这个条件是什么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-17 23:08:54 | 显示全部楼层
回复【12楼】cetcnav:
---------------------------------
就是buf的长度.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-12-6
在线时间
24 小时
发表于 2014-7-23 20:31:11 | 显示全部楼层
那这个buf的长度怎么传入函数中?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-23 23:09:47 | 显示全部楼层
回复【14楼】cetcnav:
---------------------------------
strlen(buf)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-1-9
在线时间
0 小时
发表于 2015-1-9 09:21:33 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥, 我也在研究gsm模块的代码。我觉得在这个代码里面其实u2_printf函数的参数都只有一个字符串,所以这个函数实际上也可以不采用未知参数个数的方式,而用固定为一个参数的方式来代替,不知道我的理解是不是对的?
回复 支持 反对

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-1-9 15:49:39 | 显示全部楼层
留名,学习了……
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-1-5
在线时间
15 小时
发表于 2015-4-29 19:34:58 | 显示全部楼层
学习了,正在用两个串口控制
回复 支持 反对

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2015-12-30 16:34:52 | 显示全部楼层
楼主,请问你解决问题了没有呀?我的也碰到你一样的问题。把fputc这个函数里面改成串口号3,结果一调用printf函数就死掉了。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复 支持 反对

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2015-12-30 17:56:44 | 显示全部楼层
嘎嘎,我知道什么原因了。串口3初始化没弄好就会导致调用printf程序跑死的情况。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复 支持 反对

使用道具 举报

25

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2015-5-6
在线时间
19 小时
发表于 2016-3-10 19:33:01 | 显示全部楼层
华南虎 发表于 2015-12-30 17:56
嘎嘎,我知道什么原因了。串口3初始化没弄好就会导致调用printf程序跑死的情况。

我初始化都是照抄的啊,为什么会跑死呢?
回复 支持 反对

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2016-5-9 22:10:26 | 显示全部楼层
胡桃 发表于 2016-3-10 19:33
我初始化都是照抄的啊,为什么会跑死呢?

应该是照抄了串口1的,但是某个寄存器没配置好。不要打印,用串口发送函数能正常发送数据了,打印就没问题了。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-6
在线时间
3 小时
发表于 2016-8-21 11:08:01 | 显示全部楼层
我也是直接将串口1的配置改成了串口3的,但是没有成功

/*
*********************************************************************************************************
*        函 数 名: bsp_InitUart
*        功能说明: 初始化CPU的USART1串口硬件设备。未启用中断。
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitUart(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        /* 第1步:打开GPIO和USART部件的时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

        /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        /* 第3步:将USART Rx的GPIO配置为浮空输入模式
                由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的
                但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数
        */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        /*  第3步已经做了,因此这步可以不做
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        */
        GPIO_Init(GPIOB, &GPIO_InitStructure);


        /* 第4步:配置USART参数
            - 波特率   = 115200 baud
            - 数据长度 = 8 Bits
            - 1个停止位
            - 无校验
            - 禁止硬件流控(即禁止RTS和CTS)
            - 使能接收和发送
        */
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART3, &USART_InitStructure);

        /* 第5步:使能 USART, 配置完毕 */
        USART_Cmd(USART3, ENABLE);

        /*
                CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
                如下语句解决第1个字节无法正确发送出去的问题:
                 清发送完成标志,Transmission Complete flag
        */
        USART_ClearFlag(USART3, USART_FLAG_TC);   
}
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-6-22
在线时间
56 小时
发表于 2016-8-25 10:44:26 | 显示全部楼层
jun 发表于 2016-8-21 11:08
我也是直接将串口1的配置改成了串口3的,但是没有成功

/*

中断服务函数呢?
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-8-25
在线时间
2 小时
发表于 2016-9-16 23:22:32 | 显示全部楼层
华南虎 发表于 2016-5-9 22:10
应该是照抄了串口1的,但是某个寄存器没配置好。不要打印,用串口发送函数能正常发送数据了,打印就没问 ...

是哪个寄存器没配置好造成这个问题啊,我现在也是照抄USART1出问题
回复 支持 反对

使用道具 举报

2

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
812
金钱
812
注册时间
2016-3-9
在线时间
83 小时
发表于 2016-10-8 14:45:18 | 显示全部楼层
同样有问题,留个言.我的是收到的不一样,例如printf("1");   串口显示是g
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-10-9
在线时间
14 小时
发表于 2016-11-30 17:31:17 | 显示全部楼层
cetcnav 发表于 2014-7-23 20:31
那这个buf的长度怎么传入函数中?

前辈 你之前的双串口打印输出调通了吧  求指点啊
回复 支持 反对

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2017-6-16 08:24:01 | 显示全部楼层
冯文书 发表于 2016-9-16 23:22
是哪个寄存器没配置好造成这个问题啊,我现在也是照抄USART1出问题

不好意思,我太久没上这号了,你问题解决了吗?
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 04:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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