貌似不仅仅是不定长的问题,我现在修改了字符串的打包代码,把每帧长度都做成固定的,这样每包数据也就固定长度了,但是依然白搭跑几秒就出错(只有300Kbps多一点),单片机甚至触发看门狗重启。如果用另一种模式打包,跑2Mbps都稳稳的。我的老笔记本依然稳健发挥,两种模式都没问题,只是接收2Mbps很吃力。
void DataPack(void)
{
int8_t *p;
char buf1[16],buf2[16],buf3[16],buf4[16];
static char Complete[10] = "COMPLETE";
uint8_t Single[24] = {0xA5,0xA5,0xA5,0xA5,0xA5,0xA5,0xA5,0xA5};
static char Buf[64];
uint16_t i=0;
float ActAngle;
uint32_t TIM5_CNT;
int32_t TIM2_CNT;
static uint8_t Finish = 1;
if(CheckDelay(&DelayTimePack) == 0)
{
tcp_server_test();
Set_Delay_Time(PackPeriod,&DelayTimePack);
if((PackEn==0) && (PackCount==0))
{
if(Finish == 0)
{
Finish = 1;
if(PackMode == 1)
{
GetServerSendData(Complete,8);
}
else
{
for(i=0;i<8;i++)
{
DataPackBuf[i] = 0xA6;
}
for(i=8;i<1440;i++)
{
DataPackBuf[i] = 0;
}
GetServerSendData((char *)DataPackBuf,1440);
}
}
return;
}
Finish = 0;
TIM2_CNT = TIM2->CNT;
TIM5_CNT = TIM5->CNT;
ActAngle = (float)TIM2_CNT * 0.0018;
if(PackMode == 1)
{
sprintf(buf1,"%10u",TIM5_CNT);
sprintf(buf2,"%8.3f",TargetAngle);
sprintf(buf3,"%8.3f",ActAngle);
sprintf(buf4,"%8.3f",FeedBackAngle);
sprintf(Buf,"%s,%s,%s,%s,\n\r",buf1,buf2,buf3,buf4);
for(i=0;i<40;i++)
{
DataPackBuf[PackCount*40+i] = Buf[i];
}
PackCount++;
if(PackCount >= 36)
{
GetServerSendData((char *)DataPackBuf,1440);
PackCount = 0;
}
}
else
{
Single[8] = TIM5_CNT;
Single[9] = TIM5_CNT>>8;
Single[10] = TIM5_CNT>>16;
Single[11] = TIM5_CNT>>24;
p = (int8_t *)&TargetAngle;
Single[12] = p[0];
Single[13] = p[1];
Single[14] = p[2];
Single[15] = p[3];
p = (int8_t *)&ActAngle;
Single[16] = p[0];
Single[17] = p[1];
Single[18] = p[2];
Single[19] = p[3];
p = (int8_t *)&FeedBackAngle;
Single[20] = p[0];
Single[21] = p[1];
Single[22] = p[2];
Single[23] = p[3];
for(i=0;i<24;i++)
{
DataPackBuf[PackCount*24+i] = Single[i];
}
PackCount++;
if(PackCount >=6)
{
GetServerSendData((char *)DataPackBuf,1440);
PackCount = 0;
}
}
}
}
这个函数就丢在大循环里,里边的if(cheakdelay())每1ms为真一次,也就是说1ms打一帧到数据包里。
下边是协议,我开始怀疑是命令应答导致的,但是把应答关了也白搭。
10 命令的应答和数据传输在字符串模式下板卡会将上位机发来的命令原样返回作为应答,非协议内指令返回字符串“ERROR”。HEX模式无应答。 字符串模式上传: 数据以csv格式传输,数据内容为:“时间戳,目标角度,编码器计数值,实际角度,\n\r”;其中目标角度和实际角度为浮点数。完成测试后发送字符串“COMPLETE” HEX模式上传: 帧头位置:Byte0-Byte7 帧头内容:0xA5 0xA5 0xA5 0xA5 0xA5 0xA5 0xA5 0xA5 时间戳位置:Byte8-Byte11 时间戳数据类型:uint32(低位在前) 目标角度位置:Byte12-Byte15 目标角度数据类型:float(低位在前) 实际角度位置:Byte16-Byte19 实际角度数据类型:float(低位在前) 电机反馈角度位置:Byte20-Byte23 电机反馈角度数据类型:float(低位在前) 60帧数据为1包。 完成测试后发送帧头为0xA6 0xA6 0xA6 0xA6 0xA6 0xA6 0xA6 0xA6的停止包。
|