打印

stm32串口连续接收数据出错

[复制链接]
3773|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yjnisangel|  楼主 | 2013-7-16 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yjnisangel 于 2013-7-16 22:30 编辑

stm32 串口2 采用DMA方式数据接收发送,用串口调试助手,=在19200波特率下,100ms周期下,连续发送80个字节的一帧数据,回上来时数据有错误,麻烦高手帮我看下是哪里的问题,我是采用空闲中断接收数据的,串口中断如下

void USART2_IRQHandler(void)
{
   
    uint16 i;
   
    if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET)
    {
        
           
        //  USART_ClearITPendingBit(USART2, USART_IT_IDLE);
            //读SR后读DR清除Idle
        i = USART2->SR;
        i = USART2->DR;        
     DMA_Cmd(DMA1_Channel6, DISABLE);
          DataLen=256-DMA_GetCurrDataCounter(DMA1_Channel6);
          //if(DataLen=0)

         if(DataLen > 0)
         {   
                    //if(!USART_GetITStatus(USART2,USART_IT_IDLE))                  
              //将数据送DMA存储地址
             for(i=0;i<DataLen;i++)
             {
               USART2_SEND_DATA=USART2_RECEIVE_DATA;
                           
             }
            RxEnd=1;//接收结束标志               
            }
                 DMA1_Channel6->CMAR = (u32)USART2_RECEIVE_DATA;         
             DMA1_Channel6->CNDTR = 256;//重装填
         DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA         
                  
    }        
                  
            
                 RxInterruptFlag=1;//接收中断标志位
                 TimerRxCount=0;//串口中断时不定时计数

                                

          DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//清标志
                 


        if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
         {
            USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);
         }
          // USART_ClearITPendingBit(USART2, USART_IT_TC);
           
}



在main函数里,串口发送回来收到得数据

while (1)
   {
       if(RxEnd==1)
                   {        
                    RxEnd=0;
             //USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
             DMA_Cmd(DMA1_Channel7, DISABLE); //改变datasize前先要禁止通道工作
             DMA1_Channel7->CNDTR=DataLen; //DMA1,传输数据量
                         DMA1_Channel7->CMAR = (u32)USART2_SEND_DATA;
             //USART2_TxFlag=0;//DMA传输开始标志量        
            DMA_Cmd(DMA1_Channel7, ENABLE);
                                                         
           }
         

收发缓存都是定义256,串口调试助手上,连续发送定长数据,收到的数据有时会一串数据后面丢了几个字节,有时会两帧数据链在一起发回来

麻烦高手指点下,先谢谢了
沙发
1yumao| | 2013-11-2 13:47 | 只看该作者
同问啊

使用特权

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

本版积分规则

4

主题

29

帖子

0

粉丝