打印
[技术问题解答]

KL25串口接收数据老丢包,怎么办?

[复制链接]
1861|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 | 只看该作者
还得看看你的主函数里面是怎么写的

使用特权

评论回复
5
FSL_TICS_Jeremy| | 2015-11-2 09:46 | 只看该作者
建议:1. 有无发现UART0丢包是否有规律可循;2. 如果试试DMA传输的方式来替代中断,这样可以提高数据接收速率

使用特权

评论回复
6
leumber|  楼主 | 2015-11-2 16:45 | 只看该作者
fclmyl2 发表于 2015-10-30 19:58
串口接收的内容 连续放入一个数组里,之后再处理,这样丢的可能性小

我就是放在一个数组里面的,调试时如果出现问题这个数组会保存数据,保存的数据不是从头开始的,如果正常他就每次清空

使用特权

评论回复
7
leumber|  楼主 | 2015-11-2 17:25 | 只看该作者
跟屁虫 发表于 2015-10-30 21:48
有没有统计为什么丢啊,是不是别的地方写的程序影响了

我用数组接收,有时候就会得到不完整的包中某些数据,而且我必须清OR那就是说我的数据每次读不完,就会卡住,必须清OR,似乎是时间上的问题,我用ucos的,但是我是进中断就加屏蔽了的

使用特权

评论回复
8
leumber|  楼主 | 2015-11-2 17:30 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-11-2 09:46
建议:1. 有无发现UART0丢包是否有规律可循;2. 如果试试DMA传输的方式来替代中断,这样可以提高数据接收速 ...

丢的也没什么规律,自己设的数组,它不安顺序放似的,DMA还没接触过,我试试看

使用特权

评论回复
9
leumber|  楼主 | 2015-11-10 17:22 | 只看该作者
后来查出来是因为ADC采集大量占用CPU资源,会导致数据读取出错,很多情况下使OR溢出,使用了DMA接收后解决了问题。

使用特权

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

本版积分规则

4

主题

21

帖子

1

粉丝