打印
[STM32F0]

串口利用接收标志位来循环接收字符串问题

[复制链接]
3524|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
svenyang|  楼主 | 2016-10-10 13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 svenyang 于 2016-10-11 08:57 编辑

最近在调F0和温控器的串口通信,遇到一个问题,那就是怎样不通过中断连续读取温控器返回的字符串,代码如下:
                                 for(i=0;TxBuf2!='\0';i++)   
                                 {   
                                     USART_SendData(USART2,TxBuf2);
                                     while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
                                 }
                                 i=0;                                 
                                while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)==SET)//利用接收标志位来循环接收字符
                                 {
                                     if((USART_ReceiveData(USART2)==0x0A) || (USART_ReceiveData(USART2)==0x0D))
                                        {
                                            i=0;
                                            USART_ClearFlag(USART2,USART_FLAG_RXNE);
                                        }
                                     else
                                        {               
                                            USART_ClearFlag(USART2,USART_FLAG_RXNE);//清除当前字符的标志位                                                
                                            RxBuf2{i}
=USART_ReceiveData(USART2);
                                            i++;
                                            while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)==RESET);//等待下一个字符的标志位
                                        }
                                  }        
以上发送并接受返回字符串并存在RxBuf[20]里面,却发现一直只能收到第一个字符,后面全部收不到。
有人说此类一般是读取速度太慢了,但是貌似这段程序已经是很精简了,难道是F0的主频太低,温控器主频太高导致的?
沙发
zhaoxinzxzx| | 2016-10-10 14:18 | 只看该作者
lz,你第一个字节收到以后标志位清空就退出while循环了,后面当然收不到了

使用特权

评论回复
板凳
svenyang|  楼主 | 2016-10-10 14:29 | 只看该作者
zhaoxinzxzx 发表于 2016-10-10 14:18
lz,你第一个字节收到以后标志位清空就退出while循环了,后面当然收不到了

最后一句是等待下一个标志位啊:
while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)==RESET);

使用特权

评论回复
地板
mmuuss586| | 2016-10-10 19:34 | 只看该作者
这段程序在什么地方执行啊?中断还是主程序里,也不是很长;还要简单的话,改成操作寄存器;
另外波特率多少啊?

使用特权

评论回复
5
cowboy2014| | 2016-10-10 19:43 | 只看该作者
中断里面写发送函数是不是太占用时间?

使用特权

评论回复
6
dongnanxibei| | 2016-10-10 21:01 | 只看该作者
这个不是有波特率没,怎么还有什么快慢之分,只要两边的波特率一致就行。

使用特权

评论回复
7
svenyang|  楼主 | 2016-10-11 08:48 | 只看该作者
mmuuss586 发表于 2016-10-10 19:34
这段程序在什么地方执行啊?中断还是主程序里,也不是很长;还要简单的话,改成操作寄存器;
另外波特率多 ...

是在中断里面执行的,两边的波特率都是57600,但是接收字符串就这一段程序,不需要反复进中断

使用特权

评论回复
8
svenyang|  楼主 | 2016-10-11 08:49 | 只看该作者
cowboy2014 发表于 2016-10-10 19:43
中断里面写发送函数是不是太占用时间?

这个原理是发送一个字符串,然后温控器会返回字符串,我用的while循环去接收字符串,发送在前面应该不影响后面while循环接收吧

使用特权

评论回复
9
svenyang|  楼主 | 2016-10-11 08:50 | 只看该作者
dongnanxibei 发表于 2016-10-10 21:01
这个不是有波特率没,怎么还有什么快慢之分,只要两边的波特率一致就行。 ...

是的 两边的波特率都是57600,就是不知道为什么利用标志位判断来循环接收字符串只能收到第一个

使用特权

评论回复
10
icecut| | 2016-10-11 13:42 | 只看该作者
不通过中断就要主程序快速轮询

使用特权

评论回复
11
svenyang|  楼主 | 2016-10-11 14:46 | 只看该作者
icecut 发表于 2016-10-11 13:42
不通过中断就要主程序快速轮询

您看一下我这段通过标志位循环接收有没有问题

使用特权

评论回复
12
icecut| | 2016-10-11 14:50 | 只看该作者
svenyang 发表于 2016-10-11 14:46
您看一下我这段通过标志位循环接收有没有问题

我就喜欢用 hal 库提供的标准函数.细节不熟悉啊.让我说就不建议自创方法.如果你想改就根据 hal 库函数改

使用特权

评论回复
13
xmshao| | 2016-10-11 17:38 | 只看该作者
svenyang 发表于 2016-10-11 14:46
您看一下我这段通过标志位循环接收有没有问题

进了中断通过查询也可以。
查询接收的函数代码,即使ST的传统标准库也有参考。这个你自己验证下就好吧。

使用特权

评论回复
14
svenyang|  楼主 | 2016-10-13 15:17 | 只看该作者
没有人能解答这段代码为什么出问题吗。。

使用特权

评论回复
15
Rangar| | 2016-10-13 19:10 | 只看该作者
波特率用的多少

使用特权

评论回复
16
svenyang|  楼主 | 2016-10-14 16:04 | 只看该作者
Rangar 发表于 2016-10-13 19:10
波特率用的多少

两边都是57600.

使用特权

评论回复
17
1203030117| | 2016-10-14 16:43 | 只看该作者
本帖最后由 1203030117 于 2016-10-14 16:44 编辑

                                 for(i=0;TxBuf2!='\0';i++)   
                                 {   
                                     USART_SendData(USART2,TxBuf2);
                                     while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
                                 }
这段语句如果也在中断里面,,那你就坑了,,接完第一个就卡在这里,,出不去了,,

使用特权

评论回复
18
svenyang|  楼主 | 2016-10-14 16:53 | 只看该作者
1203030117 发表于 2016-10-14 16:43
for(i=0;TxBuf2!='\0';i++)   
                                 {   
...

兄台说的没错 ,这段全部在中断里面 ,不过你复制的是发送,发送是没问题的。

使用特权

评论回复
19
dongnanxibei| | 2016-10-16 09:00 | 只看该作者
换成9600波特率试试看,速度快,如果晶振不准就会误码率高

使用特权

评论回复
20
svenyang|  楼主 | 2016-10-17 08:52 | 只看该作者
dongnanxibei 发表于 2016-10-16 09:00
换成9600波特率试试看,速度快,如果晶振不准就会误码率高

下面的温控器是57600,所以必须匹配。另外利用中断接收方式是没问题的,就这种方式有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

1

粉丝