OpenEdv-开源电子网

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

printf("\r\n您发送的消息为:\r\n");中最后一个\r\n为什么不是回车换行?

[复制链接]

5

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-4-30 15:44:40 | 显示全部楼层 |阅读模式
5金钱
在进行串口实验时为什么printf("\r\n您发送的消息为:\r\n");中最后一个\r\n为什么不换行?如果把\r\n删掉则会“:”会变成“?”。
在其他地方printf后面的\r\n却是换行功能。求解答!

最佳答案

查看完整内容[请看2#楼]

在 printf("\r\n您发送的消息为:\r\n");后面加一句等待发送完成 while((USART1->SR&0X40)==0);  然后显示你发送的内容  不加这句就可能导致你发送的第一个字符出问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-4-30 15:44:41 | 显示全部楼层
在 printf("\r\n您发送的消息为:\r\n");后面加一句等待发送完成 while((USART1->SR&0X40)==0); 
然后显示你发送的内容  不加这句就可能导致你发送的第一个字符出问题
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2015-4-30
在线时间
2 小时
 楼主| 发表于 2015-5-1 10:40:20 | 显示全部楼层
if(USART_RX_STA&0x8000)
{    
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
有加while((USART1->SR&0X40)==0);,但问题的关键是第一个printf后面的\r\n不是换行功能,如果去掉\r\n则\r\n前面一个字会变成问号
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-1-28
在线时间
6 小时
发表于 2016-5-3 09:28:44 | 显示全部楼层
感觉这个论坛没想象的那么好,问题简单了,也没人来指导。关键是如果都会的话,谁还去买开发板呢?!
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-1-7
在线时间
13 小时
发表于 2016-5-3 12:44:37 | 显示全部楼层
MARK,跟进学习
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
发表于 2016-5-3 16:16:12 | 显示全部楼层
linjiangxian89 发表于 2016-5-3 09:28
感觉这个论坛没想象的那么好,问题简单了,也没人来指导。关键是如果都会的话,谁还去买开发板呢?!

  
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-4-20
在线时间
22 小时
发表于 2016-5-3 16:37:57 | 显示全部楼层
linjiangxian89 发表于 2016-5-3 09:28
感觉这个论坛没想象的那么好,问题简单了,也没人来指导。关键是如果都会的话,谁还去买开发板呢?!

并不只是这样!现在好多是伸手党!小问题都懒的自己查,上论坛就开始问,遇到点小问题就上论坛,完全没有自学能力,没有培养成良好的解决问题的习惯!
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-1-28
在线时间
6 小时
发表于 2016-5-3 21:45:57 | 显示全部楼层
szb0321 发表于 2016-5-3 16:37
并不只是这样!现在好多是伸手党!小问题都懒的自己查,上论坛就开始问,遇到点小问题就上论坛,完全没有 ...

嗯,或许是吧。但是对于买开发板的新手来说有时候买的不只是板子,也是想得到指导,当然指导是无价的。对于这个问题,我也百度了,没找到相应的解答,既然论坛里提出了这个问题,我觉得大神们看到了给点拨明白不是很好的事情吗?就像现在,你答复了我,但却没有回答问题....对于我们两个来说,都是在浪费时间。咱们是理性来探讨哈,希望您可以指导一下。这样以后再有这种问题的新手,看到这个帖子就不会再有类似的疑问了。谢谢!
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-1-28
在线时间
6 小时
发表于 2016-5-3 21:46:53 | 显示全部楼层

您可以帮解答一下吗?我试着删了"\r\n",串口读出的会有乱码~
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-1-28
在线时间
6 小时
发表于 2016-5-3 22:02:22 | 显示全部楼层
szb0321 发表于 2016-5-3 16:37
并不只是这样!现在好多是伸手党!小问题都懒的自己查,上论坛就开始问,遇到点小问题就上论坛,完全没有 ...

不好意思,感觉话说多了....抱歉....
回复

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-5-3 22:08:24 | 显示全部楼层
我也不太清楚,但是我感觉每个要发送的数组都以\n作为结束,所以用printf的时候必须要用\n
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-1-28
在线时间
6 小时
发表于 2016-5-3 22:14:47 | 显示全部楼层
庄健宇 发表于 2016-5-3 22:08
我也不太清楚,但是我感觉每个要发送的数组都以\n作为结束,所以用printf的时候必须要用\n

嗯,但是在串口这里应该还有别的讲究。
回复

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-5-3 22:17:29 | 显示全部楼层
我知道为什么了,struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif
在这个函数定义中,while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
这个是以/n为结束标志,如果没有printf中没有/n,就不知道结束没结束所以会出现乱码的情况。
我是这样理解的,但是不知道对不对。
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-1-28
在线时间
6 小时
发表于 2016-5-3 22:46:55 | 显示全部楼层
庄健宇 发表于 2016-5-3 22:17
我知道为什么了,struct __FILE
{
        int handle;

回复

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-5-4 00:23:50 | 显示全部楼层
我自己的想法,我也是个初学者。
回复

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-5-4 00:24:02 | 显示全部楼层
我自己的想法,我也是个初学者。
回复

使用道具 举报

50

主题

193

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-11
在线时间
141 小时
发表于 2016-5-4 09:25:17 | 显示全部楼层
linjiangxian89 发表于 2016-5-3 21:46
您可以帮解答一下吗?我试着删了"\r\n",串口读出的会有乱码~

我也是新手,而且我都不知道为什么在前边加一个  \R\N
我通过串口输出是这样的:
printf("t0=%d\r\n",t);           后边的\n\r  就是换行并且光标在新的一行的最开始位置
我当时也试着去掉一个\r或者\n
去掉一个  光标位置不合适,要么就都去掉 就一个接着一个输出
要么就都留着  换行输出
前边加\n\r确实不懂,我以前学C语言,也不记得 输出时候在前边加个这是干嘛的
我以前也发过串口求助帖子,没人教,有人 是乱教。我弄了一周没弄出来,后来有个好心人认真教了我,我才搞出来。。。。。
回复

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-5-7 23:16:06 | 显示全部楼层
滴丶滴 发表于 2016-5-4 09:25
我也是新手,而且我都不知道为什么在前边加一个  \R\N
我通过串口输出是这样的:
printf("t0=%d\r\n",t ...

数组有结束标志服,所以你不加/n会乱码,你去看看ascii表
回复

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-5-7 23:16:18 | 显示全部楼层
滴丶滴 发表于 2016-5-4 09:25
我也是新手,而且我都不知道为什么在前边加一个  \R\N
我通过串口输出是这样的:
printf("t0=%d\r\n",t ...

数组有结束标志服,所以你不加/n会乱码,你去看看ascii表
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2016-6-1 11:32:03 | 显示全部楼层
我觉得你应该先把你的串口接收函数看明白,当连续接收到\n\r的时候就说明接收完成,标志位15置1,执行到主函数的while循环。
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2018-4-7
在线时间
0 小时
发表于 2016-7-23 18:29:08 | 显示全部楼层
同问,楼主这个问题解决吗?卡在这里很久了
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-4-1
在线时间
3 小时
发表于 2017-4-14 18:58:14 | 显示全部楼层
szb0321 发表于 2016-5-3 16:37
并不只是这样!现在好多是伸手党!小问题都懒的自己查,上论坛就开始问,遇到点小问题就上论坛,完全没有 ...

听你这语气貌似网上的答案都是天上掉下来的啊!
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2020-11-24
在线时间
38 小时
发表于 2020-12-1 19:35:28 | 显示全部楼层
改为
  1. printf("\r\n您发送的消息为:\n");
复制代码

显示上位机发送的数据正常
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 11:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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