有高手在STM32上同时使用过TIMER的编码器接口和USART吗?是否有遇到BUG,可以一起交流一下啊

2019-10-15 20:52发布

我最近在用32F4做一个全向轮底盘,在通信上遇到了一个大BUG,只要轮子一转(及编码器接口计数了),USART就会少读取1-2字节,不知道如何解决,请各位大神帮帮忙。
通信协议是交互式的,上位机发下一帧(22字节)命令,底盘收到命令后,进行处理,然后返回一帧数据。上位机只有收到反馈的数据帧后才会发送下一行命令。轮子的转速用编码器采集,通过timer的编码器接口计数。
现在交互通信可以连续不断的循环进行,但是一旦我转一下底盘的轮子,通信立马就停止了,即便强制性向底盘再发送一帧数据,最多通信几个循环过后还是会停止,而且返回的数据还不全。我不太清楚是不是timer编码器接口影响了通信,蛋疼的是这种状况我都不知道怎么调试,出错是随机的,不知道什么时候、在哪儿打断点。下面是我的部分程序:

/*发送数据帧的函数,接收到命令,处理过后调用*/
void Send_Frame(MSG *msg)
{
        uint8_t i;
        for(i=0;i<msg_length;i++)
        {
                USART_SendData(USART2, msg->data);//每次发送一个字节
                while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//检查TC标识,看是否发送完成
        }
}

/*用接收中断接收数据帧*/
void USART2_IRQHandler(void)
{
        static uint8_t head_flag=0;//
        static uint8_t count = 0;//
        static uint8_t data[msg_length]={0};//
        static uint8_t flag=0;
        uint8_t ch;
         
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {
                ch = USART_ReceiveData(USART2);
                data[count] = ch;
                count = (count + 1) % msg_length;      
               
                if(count == 0 && head_flag == 1)
                {//接收完了一帧数据,将其保存
                        Save_Frame(data);
                        count = head_flag = flag = 0;
                        memset( data, 0, 22);   
                }
        }
}


还有更邪门儿的,这是我对于0x04类型的指令的处理程序
case 0x04:
/*速度计算*/
。。。。。。。。。。。。。。。。。。。。。
/*发送数据帧赋值*/
。。。。。。。。。。。。。。。。。。。。。
/*将上位机下发的数据处理后保存*/
coord.X=(double)(cmd_buffer[buf_tail].D1-2000000000)/10000;
coord.Y=(double)(cmd_buffer[buf_tail].D2-2000000000)/10000;
coord.Theta=(double)(cmd_buffer[buf_tail].D3-30000)/100/57.29578;//××××××××
/*回发数据帧*/
Send_Frame(&msg);
break;

××××××那行代码,我一旦加上,04指令就不能循环通信,注释掉就可以。。

本来就弱鸡,现在就跟无头苍蝇一样。请大家帮帮忙。。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。