[STM32F1] 串口接收丢失字节问题

[复制链接]
9088|58
 楼主| coderdd 发表于 2017-6-22 19:15 | 显示全部楼层 |阅读模式
本帖最后由 coderdd 于 2017-6-23 07:52 编辑

用的stm32f103的片子,115200的波特率,现在偶尔发现接收串口数据会漏掉一个字节,有点致命,程序怎样避免呢?是否要调整串口中断优先级?还是怎么优化?
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    RX_Buffer_Temp=USART_ReceiveData(USART1);
    if(uart_num<98)
    {
      RX_Buffer[uart_num] = RX_Buffer_Temp;
      uart_num++;
    }
    else
    {
      uart_num=0;
    }   
    if(RX_Buffer_Temp=='\n'&&RX_Buffer[uart_num-2]=='\r')
    {
      uart_num=0;
      flagReceive = 1;
    }
  }
  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) // 检查 ORE 标志
  {
      USART_ClearFlag(USART1,USART_FLAG_ORE);
      RX_Buffer_Temp=USART_ReceiveData(USART1);
  }
}

feelhyq 发表于 2017-6-22 20:57 | 显示全部楼层
if(RX_Buffer_Temp=='\n'&&RX_Buffer[uart_num-2]=='\r') 中的 RX_Buffer[uart_num-2]=='\r'判断有遗漏,如果uart_num = 0,那么         uart_num-2该是多少呢?
xmshao 发表于 2017-6-22 21:02 | 显示全部楼层
  如果是中断优先级方面的问题,调整可能有效。如果不是,还得从代码逻辑方面找找原因。
feelhyq 发表于 2017-6-22 21:06 | 显示全部楼层
feelhyq 发表于 2017-6-22 20:57
if(RX_Buffer_Temp=='\n'&&RX_Buffer=='\r') 中的 RX_Buffer=='\r'判断有遗漏,如果uart_num = 0,那么     ...

换句话说  Rx_Buffer[97] = '/r',Rx_Buffer[0] = '/n'这种情况考虑到了没有
feelhyq 发表于 2017-6-22 21:09 | 显示全部楼层
本帖最后由 feelhyq 于 2017-6-22 21:11 编辑

    if(uart_num<98)
    {
      RX_Buffer[uart_num] = RX_Buffer_Temp;
      uart_num++;
    }
    else
    {
      uart_num=0;
    }   else里面,你仅仅只是将uart_num重置为0了,但是没有接收该字符,应该改为
uart_num=0;
RX_Buffer[uart_num] = RX_Buffer_Temp;
uart_num++;
gygp 发表于 2017-6-22 22:40 | 显示全部楼层
发送的速度太快?

评论

我也打算降低波特率试试  发表于 2017-6-23 07:58
chenci2013 发表于 2017-6-22 22:40 | 显示全部楼层
其他的中断函数执行了吗?
biechedan 发表于 2017-6-22 22:40 | 显示全部楼层
串口中断代码太多了。
wangdezhi 发表于 2017-6-22 22:41 | 显示全部楼层
所有的处理函数都在外部进行设计。

评论

这个内部已经没什么复杂的操作了,我感觉原因肯定不是内部代码多的问题  发表于 2017-6-23 07:59
isseed 发表于 2017-6-22 22:41 | 显示全部楼层
这个是发送的问题吗?
suzhanhua 发表于 2017-6-22 22:41 | 显示全部楼层
这个使用工具测试一下数据
mituzu 发表于 2017-6-22 22:42 | 显示全部楼层
多长时间会漏掉一个数据呢?
hellosdc 发表于 2017-6-22 22:42 | 显示全部楼层
这个波特率不是正常都是这么工作的吗
uiint 发表于 2017-6-22 22:42 | 显示全部楼层
115200的波特率不是正常大小的吗
gygp 发表于 2017-6-22 22:43 | 显示全部楼层
这个只能通过校验实现了。
chenci2013 发表于 2017-6-22 22:43 | 显示全部楼层
不是有中断优先级调试的寄存器吗
biechedan 发表于 2017-6-22 22:43 | 显示全部楼层
看一下你的配置代码
wangdezhi 发表于 2017-6-22 22:43 | 显示全部楼层
还有其他的中断吗?
isseed 发表于 2017-6-22 22:44 | 显示全部楼层
中断的函数不能太复杂。
suzhanhua 发表于 2017-6-22 22:44 | 显示全部楼层
串口的优先级是最高的才行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

385

帖子

11

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