OpenEdv-开源电子网

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

添加了C++文件后,printf重定位报错,如何解决?

[复制链接]

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
发表于 2019-8-9 09:32:25 | 显示全部楼层 |阅读模式
添加了C++文件后,printf重定位报错,如何解决?
错误代码:..\OBJ\Template.axf: Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and usart.o).
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2019-8-12 23:26:21 | 显示全部楼层
问题已解决。
下面给出解决办法:
我所参考的链接:https://blog.csdn.net/qq_39276007/article/details/79245299
1.把正点原子例程里有关printf重定位的语句屏蔽掉,让后下载http://infocenter.arm.com/help/t ... hed/3844/retarget.c,并添加到工程里;
QQ拼音截图20190812232600.png
2.retarget.c文件中,实现串口读写函数,如下图所示:
QQ拼音截图20190812232208.png
效果图:
QQ拼音截图20190812232409.png
ps:main文件可以是c也可以是c++


吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复 支持 1 反对 0

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-8-9 10:06:43 | 显示全部楼层
本帖最后由 brucewoo 于 2019-8-9 10:09 编辑

源码是一个项目中的,不方便公开。
这里贴串口的一部分实现,你参考这个思路就行了:

  1. char szBuffer[BWS_BUFF_SIZE]={0};     //全局变量,用作发送转换的字符串缓冲
  2. void bwSerial::print(const char* szFormat, ...)
  3. {
  4.         va_list args;
  5.         va_start(args, szFormat);
  6.         vsprintf(szBuffer,szFormat,args);
  7.         put(szBuffer);
  8.         va_end(args);
  9. }

  10. void bwSerial::put(char *str)
  11. {
  12.         while(*str){
  13.                 USART_SendData(usartx, *str);    /*发送单个数据 */
  14.                 while(USART_GetFlagStatus(usartx, USART_FLAG_TXE)==RESET);/* 检测指定的USART标志位  发送完成*/
  15.                 str++;
  16.         }                                                                                                        
  17. }
复制代码

回复 支持 1 反对 0

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2019-8-9 09:56:24 | 显示全部楼层
本帖最后由 潘长青 于 2019-8-9 09:58 编辑

后来调试了下发现,只要在c++文件中包含<iostream>头文件,就会出现这个错误。
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-8-9 09:59:56 | 显示全部楼层
我自己尝试过,C++的确不能用C的办法重定位putc来printf,我最后是自己写了一个串口类,调用sprintf生成缓冲的发送数组,再用UART发送。
回复 支持 反对

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2019-8-9 10:02:26 | 显示全部楼层
brucewoo 发表于 2019-8-9 09:59
我自己尝试过,C++的确不能用C的办法重定位putc来printf,我最后是自己写了一个串口类,调用sprintf生成缓 ...

可以分享一下么?我c++才刚接触,实现原理我懂。
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复 支持 反对

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2019-8-9 10:08:50 | 显示全部楼层
brucewoo 发表于 2019-8-9 10:06
源码是一个项目中的,不方便公开。
这里贴串口的一部分实现,你参考这个思路就行了:

有这些就够了,非常感谢你!
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复 支持 反对

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2019-8-12 21:01:23 | 显示全部楼层
brucewoo 发表于 2019-8-9 09:59
我自己尝试过,C++的确不能用C的办法重定位putc来printf,我最后是自己写了一个串口类,调用sprintf生成缓 ...

在么?为什么我c++文件一包含iostream,可以编译通过,但是串口就没反应了?
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复 支持 反对

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-2-28
在线时间
21 小时
发表于 2020-8-3 11:11:37 | 显示全部楼层
潘长青 发表于 2019-8-12 23:26
问题已解决。
下面给出解决办法:
我所参考的链接:https://blog.csdn.net/qq_39276007/article/details/ ...

你好 retarget.c下载不了,能再发个么
回复 支持 反对

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2020-8-8 22:26:39 | 显示全部楼层
扫地僧WX 发表于 2020-8-3 11:11
你好 retarget.c下载不了,能再发个么

抱歉,我自己这里也没有了。
你在百度找找吧。
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-8-14
在线时间
1 小时
发表于 2020-8-14 10:03:01 | 显示全部楼层
本帖最后由 BigBear18 于 2020-8-14 21:23 编辑
潘长青 发表于 2019-8-12 23:26
问题已解决。
下面给出解决办法:
我所参考的链接:https://blog.csdn.net/qq_39276007/article/details/ ...

您好,我是一个小白,想问一下retarget中USART_SendData和USART_GetFlagStatus函数是在哪里定义的,内容是什么呀,因为加完之后显示未定义
回复 支持 反对

使用道具 举报

66

主题

224

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1349
金钱
1349
注册时间
2018-10-4
在线时间
200 小时
 楼主| 发表于 2020-8-21 14:38:27 | 显示全部楼层
BigBear18 发表于 2020-8-14 10:03
您好,我是一个小白,想问一下retarget中USART_SendData和USART_GetFlagStatus函数是在哪里定义的,内容 ...

抱歉,我很久前弄的,都不记得了。
见名思意吧,你在找找。
吾虽浪迹天涯 却未迷失本心
欢迎光临我的CSDN博客
回复 支持 反对

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2020-8-21 15:29:01 | 显示全部楼层
BigBear18 发表于 2020-8-14 10:03
您好,我是一个小白,想问一下retarget中USART_SendData和USART_GetFlagStatus函数是在哪里定义的,内容 ...

这个是std库函数,在MDK中按F12就跳转过去可以查看。
这都是基础中的基础了,打好基础再慢慢做项目。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 16:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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