OpenEdv-开源电子网

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

关于串口的问题

[复制链接]

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
发表于 2017-1-6 11:22:48 | 显示全部楼层 |阅读模式
2金钱
使用的板子是 mini ,程序是选自原子串口实验源码例程。。
代码如下
while(1)
    {
        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;
        }else
        {
            times++;
            if(times%5000==0)
            {
                printf("\r\nALIENTEK MiniSTM32开发板 串口实验\r\n");
                printf("正点原子@ALIENTEK\r\n\r\n\r\n");
            }
            if(times%500==0)printf("请输入数据,以回车键结束\r\n");  
            if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
            delay_ms(10);   
        }
    }   
疑问在标红部分,为什么在这个for循环里要加上“while((USART1->SR&0X40)==0);//等待发送结束”?
如果删掉此句,无论接收多少字符,则只会发送一个字符。。
有几点不明白的:
① 当发送仍未完成的时候,while后的判断语句为真,此处相当于while(1),死循环,后面无语句,空循环。。那么for循环会怎么执行?
②我理解,若无此句,执行循环体时判断t<len,此条件满足,会一直执行循环,把所有接收内容进行发送。。结果当然不是了。。

还望大神们赐教。。


最佳答案

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

应该是这样的,不等完成发送就会产生覆盖
亦余心之所善,
虽九死其犹未悔。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7539
金钱
7539
注册时间
2016-11-30
在线时间
641 小时
发表于 2017-1-6 11:22:49 | 显示全部楼层
南有乔木 发表于 2017-1-6 12:14
你说的对,只会发送最后一个数据,前面的全部被屏蔽了。。。是因为前一位的数据还没发送完成就发送下一位 ...

应该是这样的,不等完成发送就会产生覆盖
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2017-1-6 11:24:02 | 显示全部楼层
串口发送需要时间,时间不到while就是死循环,时间到了while循环就退出了
我有故事,你有酒吗
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 11:30:31 | 显示全部楼层
来俩不甜的 发表于 2017-1-6 11:24
串口发送需要时间,时间不到while就是死循环,时间到了while循环就退出了

时间不到的时候,while循环是死循环,程序停在这。。for循环里t<len不就不判断了么,while()上面的发送不也就不执行了吗。。。程序一直会停在while(1)。。。
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 11:38:04 | 显示全部楼层
顶一顶
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 11:39:19 | 显示全部楼层
关于 while  for循环的接受,哪位大神有比较好的资料也可以推荐下,从学C语言开始就有疑问。。没太学懂
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2017-1-6 11:46:50 | 显示全部楼层
南有乔木 发表于 2017-1-6 11:30
时间不到的时候,while循环是死循环,程序停在这。。for循环里t

串口发送一个字节需要时间,时间不到while就是死循环,时间到了while循环就退出了。
我有故事,你有酒吗
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 11:53:47 | 显示全部楼层
来俩不甜的 发表于 2017-1-6 11:46
串口发送一个字节需要时间,时间不到while就是死循环,时间到了while循环就退出了。

没有这个while循环时,当串口发送第一个数据,是不是因为第一个还没发送完成,又对for循环进行判断,再执行发送命令,实际发送的还是第一个数据。因此,只会发送一个数据就结束了
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

13

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2016-11-15
在线时间
38 小时
发表于 2017-1-6 12:02:59 | 显示全部楼层
看一看发送一个字符是哪一个?有可能后面的字符把前面的覆盖了
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7539
金钱
7539
注册时间
2016-11-30
在线时间
641 小时
发表于 2017-1-6 12:06:03 | 显示全部楼层
一个循环嵌套而已,只要你理解代码是顺序执行的,while()没跳出是不会执行下一次for()的
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 12:09:53 | 显示全部楼层
head 发表于 2017-1-6 12:02
看一看发送一个字符是哪一个?有可能后面的字符把前面的覆盖了

我试试~~
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 12:11:14 | 显示全部楼层
lvkanger 发表于 2017-1-6 12:06
一个循环嵌套而已,只要你理解代码是顺序执行的,while()没跳出是不会执行下一次for()的

楼上已经帮我解决一部分疑问了,还是有点不懂。。
为什么没有这句while循环就只发送一个数据了,后面的全都没有了
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 12:14:09 | 显示全部楼层
head 发表于 2017-1-6 12:02
看一看发送一个字符是哪一个?有可能后面的字符把前面的覆盖了

你说的对,只会发送最后一个数据,前面的全部被屏蔽了。。。是因为前一位的数据还没发送完成就发送下一位的数据导致的吗。。
最终只能发送最后一个数据
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

13

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2016-11-15
在线时间
38 小时
发表于 2017-1-6 12:21:32 | 显示全部楼层
南有乔木 发表于 2017-1-6 12:14
你说的对,只会发送最后一个数据,前面的全部被屏蔽了。。。是因为前一位的数据还没发送完成就发送下一位 ...

有可能数据在引脚上移位的过程中出现的问题
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 12:22:20 | 显示全部楼层
lvkanger 发表于 2017-1-6 12:16
应该是这样的,不等完成发送就会产生覆盖

这下就彻底明白了,谢谢
还有个问题请教下,就不单独开贴了。我想写一个程序实现一个功能:设置DAC产生的数据通过串口发送出去,在PC端接收数据。
DAC设置好了,把DAC的输出引脚(PA4)用杜邦线连在MCU的RXD引脚(PA10)上,这样可行吗。
串口接收协议肯定得需要自己重新写,DAC产生的数据是十二位的二进制数据,不转换直接发送可以吗
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
 楼主| 发表于 2017-1-6 12:24:13 | 显示全部楼层
head 发表于 2017-1-6 12:21
有可能数据在引脚上移位的过程中出现的问题

不检测发送是否完成,就会出现未知的错误 这下懂了 。。。楼下又问个新问题,大神帮忙看看
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 04:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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