[技术问题解答] KL25串口接收数据老丢包,怎么办?

[复制链接]
2328|8
 楼主| leumber 发表于 2015-10-30 14:09 | 显示全部楼层 |阅读模式
用的是UART0中断接收的,接收20个字节,但是使用过程中有时候蓝牙发过来的数据接收不完整,后来我加上了清除OR中断,就有时候是一次成功,有时候就是得多发几次才能成功,如何解决这
void UART0_IRQHandler(void)
{  
  static U8 Uartbit0 = 0;
  UART0_MemMapPtr Channel0;
  Channel0 = UART_0;
    /* Wait until character has been received */
    while (!(UART0_S1_REG(Channel0) & UART0_S1_RDRF_MASK));
    /* Return the 8-bit data from the receiver */
    Uart[Uartbit0] = UART0_D_REG(Channel0);
    Uartbit0++;
    if((Uart[0]==0x01) && (Uart[10]==0x02))
    {
      Uartcmd = 1;
      Uartbit0 = 0;
    }  
    else if((UART0_S1_REG(Channel0)&0x08) == UART_S1_OR_MASK)
    {
      Uartbit0 = 0;
      memset(Uart,0,20);
      UART0_S1_REG(Channel0) |= UART_S1_OR_MASK;
    }
}

fclmyl2 发表于 2015-10-30 19:58 | 显示全部楼层
串口接收的内容 连续放入一个数组里,之后再处理,这样丢的可能性小
跟屁虫 发表于 2015-10-30 21:48 | 显示全部楼层
有没有统计为什么丢啊,是不是别的地方写的程序影响了
侣行天下 发表于 2015-10-31 10:09 | 显示全部楼层
还得看看你的主函数里面是怎么写的
FSL_TICS_Jeremy 发表于 2015-11-2 09:46 | 显示全部楼层
建议:1. 有无发现UART0丢包是否有规律可循;2. 如果试试DMA传输的方式来替代中断,这样可以提高数据接收速率
 楼主| leumber 发表于 2015-11-2 16:45 | 显示全部楼层
fclmyl2 发表于 2015-10-30 19:58
串口接收的内容 连续放入一个数组里,之后再处理,这样丢的可能性小

我就是放在一个数组里面的,调试时如果出现问题这个数组会保存数据,保存的数据不是从头开始的,如果正常他就每次清空
 楼主| leumber 发表于 2015-11-2 17:25 | 显示全部楼层
跟屁虫 发表于 2015-10-30 21:48
有没有统计为什么丢啊,是不是别的地方写的程序影响了

我用数组接收,有时候就会得到不完整的包中某些数据,而且我必须清OR那就是说我的数据每次读不完,就会卡住,必须清OR,似乎是时间上的问题,我用ucos的,但是我是进中断就加屏蔽了的
 楼主| leumber 发表于 2015-11-2 17:30 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2015-11-2 09:46
建议:1. 有无发现UART0丢包是否有规律可循;2. 如果试试DMA传输的方式来替代中断,这样可以提高数据接收速 ...

丢的也没什么规律,自己设的数组,它不安顺序放似的,DMA还没接触过,我试试看
 楼主| leumber 发表于 2015-11-10 17:22 | 显示全部楼层
后来查出来是因为ADC采集大量占用CPU资源,会导致数据读取出错,很多情况下使OR溢出,使用了DMA接收后解决了问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

21

帖子

1

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