stm32usart串口问题

[复制链接]
 楼主| 06006109 发表于 2012-2-14 11:22 | 显示全部楼层 |阅读模式
我刚试了一个usart串口的输入输出,发现发一个字节给stm32的时候能够正确回应数据,超过一个字节后数据出现不正常。?????求解答
中断函数如下:
void USART1_IRQHandler(void)
{
       u8 recv_dat ;
       if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)              
         {
                  recv_dat =USART_ReceiveData(USART1);
                  USART_SendData(USART1,recv_dat);
                  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){} ;        
         }
}
zsf56 发表于 2012-2-14 11:28 | 显示全部楼层
程序里估计有问题吧
 楼主| 06006109 发表于 2012-2-14 11:53 | 显示全部楼层
2# zsf56
。。。。。。具体点?
行不改名 发表于 2012-2-14 12:30 | 显示全部楼层
没清标志
 楼主| 06006109 发表于 2012-2-14 13:51 | 显示全部楼层
4# 行不改名 你说在配置处加一个清除标志吗?加了还是一样,一个字节的收发没问题,大于一个字节就出错
香水城 发表于 2012-2-14 14:14 | 显示全部楼层
看看你的程序:收到一个字节后,等到把这个字节发送出去后,再接收下一个字节;如果在发送前一个字节时,先后收到2个以上的字节,还能正确吗?
 楼主| 06006109 发表于 2012-2-14 14:40 | 显示全部楼层
回复6# ????有点看不懂。你是说收函数一次不止接收一个字节?能不能直接说说怎么改进?
香水城 发表于 2012-2-14 14:55 | 显示全部楼层
我不会告诉你具体怎么做,我只会告诉你它的原理是什么——授人以渔。

接收是由硬件完成的,一旦有数据到来,硬件就会通过移位寄存器接收下来,等一个字节接收完毕就会把这个字节从移位寄存器拷贝到一个接收缓冲区中,这时硬件可以再通过移位寄存器接收下一个字节。

USART_ReceiveData的目的只是把收到的数据从接收缓冲区读出,一旦读出了接收缓冲区中的数据之后,如果在移位寄存器中有新的数据,就会再执行上述拷贝的动作。

如果你的软件没有读出接收缓冲区中的数据,但移位寄存器中却有了新的数据,那么上述拷贝动作就不能执行,这个新的数据就会丢失。
秋天落叶 发表于 2012-2-14 20:08 | 显示全部楼层
按香主的思路应该可以很快找到问题的
jxmzzr 发表于 2012-2-14 22:31 | 显示全部楼层
设置标置位,当标置位置位时接收,接收完清零,试试吧。
tianli1980 发表于 2012-2-14 22:40 | 显示全部楼层
新手,请多多指教。本人在单片机的串接接收上经常设置标置位。呵呵,怎么设置要看自己的需要了。
dahusng7890sdo1 发表于 2012-2-16 14:18 | 显示全部楼层
我也是新手,但是看明白了,香主威武
djqinqing 发表于 2013-7-10 14:47 | 显示全部楼层
liang5319 发表于 2013-7-11 00:15 | 显示全部楼层
呵呵呵呵,个人觉得,你应该把收发的程序分开。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

0

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部