野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12498|回复: 2

我最近在用32F4做一个全向轮底盘,在通信上遇到了一个大BUG,不知道如何解决,请各...

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

/*发送数据帧的函数,接收到命令,处理过后调用*/
void Send_Frame(MSG *msg)
{
        uint8_t i;
        for(i=0;i<msg_length;i++)
        {
                USART_SendData(USART2, msg->data[i]);//每次发送一个字节
                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指令就不能循环通信,注释掉就可以。。

本来就弱鸡,现在就跟无头苍蝇一样。请大家帮帮忙。。。。。
回复

使用道具 举报

发表于 2016-12-27 08:52:14 | 显示全部楼层
把串口的中断改成最高优先级试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-28 01:07:40 | 显示全部楼层
flyleaf 发表于 2016-12-27 08:52
把串口的中断改成最高优先级试试

改成最高试了,并没什么用,测试了很久,发现定时器的编码器接口优先级似乎比可设置的最高优先级都要高。在不断串口通信条件下,只要编码器接口读到脉冲就会使串口丢失1-2个字节。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 21:32 , Processed in 0.028357 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表