高中生
最后登录1970-1-1
在线时间 小时
注册时间2016-9-21
|
我最近在用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指令就不能循环通信,注释掉就可以。。
本来就弱鸡,现在就跟无头苍蝇一样。请大家帮帮忙。。。。。
|
|