求大神,我在定义好标识符,帧格式等以后,在数据场赋值时候,进行多帧循环赋值发送,24个字节时候都可以,超过24个字节时候,接收就有错,请大神指教怎么才能发送更多字节不丢数据?
下面是发送和接收的函数:
//u8 CAN1_Send32_Msg(u32* msg,u8 len) //len表示总的需要发送字节数
//{
// u8 mbox,CAN_TxStatues;
// u16 i=0;
// u8 m=0; //每次发送的字节数;
// u8 n=0; //需要发送的字节数;
// u8 p=0; //清除缓存;
// u8 flag=0; //次数标志位;
// CanTxMsg TxMessage;
// TxMessage.StdId=0x12; // 标准标识符
// TxMessage.ExtId=0x12; // 设置扩展标示符
// TxMessage.IDE=CAN_Id_Standard; // 标准帧
// TxMessage.RTR=CAN_RTR_Data; // 数据帧
//
// for(n=0;n<len;)
// {
// TxMessage.Data[m]=msg[n];
// m++;
// n++;
// while(m%8==0)
// {
// TxMessage.DLC=8;
// i=0;
// m=0;
// mbox= CAN_Transmit(CAN1, &TxMessage);
// printf("1mbox-one=%d
", mbox);
// CAN_TxStatues= CAN_TransmitStatus(CAN1,mbox);
// while((CAN_TxStatues!=CAN_TxStatus_Ok)&& (i<0XFFF))
// {
// CAN_TxStatues= CAN_TransmitStatus(CAN1,mbox);
// i++;
// printf("1正在发送-one。。。。
");
// }
// if(i>=0XFFF)
// {
// return 1;
// }
// printf("1发送成功-one
");
// for(p=0;p<8;p++)
// {
// printf("TX2:TxMessage.Data[%d]=%d
",p, TxMessage.Data[p]);
// }
// for(p=0;p<8;p++)
// {
// TxMessage.Data[p]=0;
// }
// flag++;
// break;
// // return 0;
//
// }
//
// while((len/8==flag)&&(m==(len%8))&&(m!=0))
// {
// TxMessage.DLC=len%8;
// m=0;
// i=0;
// mbox= CAN_Transmit(CAN1, &TxMessage);
// //printf("2mbox-two=%d
", mbox);
// CAN_TxStatues= CAN_TransmitStatus(CAN1,mbox);
// while((CAN_TxStatues!=CAN_TxStatus_Ok)&& (i<0XFFF))
// {
// CAN_TxStatues= CAN_TransmitStatus(CAN1,mbox);
// i++;
// }
// if(i>=0XFFF)
// {
// return 1;
// }
// printf("3发送成功-one
");
//
// for(p=0;p<(len%8);p++)
// {
// printf("TX3:TxMessage.Data[%d]=%d
",p, TxMessage.Data[p]);
// }
// for(p=0;p<8;p++)
// {
// TxMessage.Data[p]=0;
// }
// break;
// }
// }
// return 0;
//}
接收:
u8 CAN1_Receive_Msg(u32 *buf)
{
u32 i;
u8 n=0;
u8 p;
CanRxMsg RxMessage;
//p=CAN_MessagePending(CAN1,CAN_FIFO0);
while(CAN_MessagePending(CAN1,CAN_FIFO0)!=0)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据
// p=CAN_MessagePending(CAN1,CAN_FIFO0);
if((RxMessage.Data[0]==0xaa)&&(RxMessage.Data[1]==0x55))
{
for(i=0;i<RxMessage.DLC;i++,n++)
{
buf[n]=RxMessage.Data[i];
printf("RX2:RxMessage.Data[%d]=%d
",i, RxMessage.Data[i]);
}
n1=n;
}
if((RxMessage.Data[0]!=0xaa)&&(RxMessage.Data[1]!=0x55))
{
//printf("RxMessage.Data[2]=%d
",RxMessage.Data[0]);
n=n1;
for(i=0;i<RxMessage.DLC;i++,n++)
{
buf[n]=RxMessage.Data[i];
printf("RX1:RxMessage.Data[%d]=%d
",i,RxMessage.Data[i]);
}
n1=n;
printf("n3=%d
",n);
printf("n1=%d
",n1);
}
}
return n;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我又想了一下,发送的时候在相同的标识符下,可以发送多次,例如我发送五次,把数据发送过去了,但是接收的时候CAN_MessagePending(CAN1,CAN_FIFO0)这句话其实一直有数据接收,不能于0,这时候我怎么让CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);这句函数对发送的五个数据全部处理呢,好像是五组数据全发送成功了,但是接收时候一个队列只能接收三个报文,所以我发送1 2 3......38 39 40 ,接收的时候只是收到 1 2 3......16 33 34 35 36 37 38 39 40,中间17到32给丢失了,求教怎么处理?
一周热门 更多>