单帧接收正常,多帧情况下分帧接收时,只能重复收到第一帧,程序如下,数组时分配的是一个足够大的静态数组,不知道怎么回事?
//ID号表示:主机, 控制1,查询1 表示接收的是查询1的数据
if (RxMessage.StdId == (0x7ff & ((DEV_HOST << 8) | (ORD1 << 4) | (CHK1 << 0)))) {
//GPIO_SetBits(GPIOC, GPIO_Pin_7 | GPIO_Pin_4);
if (RxMessage.Data[0]==0x00 ){//单帧发送
for (i = 1; i < 8; i++) {
USART_PutCh(USART1,RxMessage.Data);}}
if (RxMessage.Data[0]&0x41==0x41) {//多帧的第一帧
for (i = 0; i < 8; i++) {
CanReBuff[l++]=RxMessage.Data; }
}
if (RxMessage.Data[0]&0x80==0x80 ) {//多帧的中间帧
for (i = 0; i < 8; i++) {
CanReBuff[l++]=RxMessage.Data; }
}
if (RxMessage.Data[0]&0xC0==0xC0) //多帧的最后一帧,接收完成后向串口发送该多帧
{
for (i = 0; i < 8; i++) {
CanReBuff[l++]=RxMessage.Data;
}
USART_PutStr(USART1,CanReBuff);
}
CAN_ClearITPendingBit(CAN_IT_FMP0); //清除挂起中断 }
}
不知你USART_PutStr(USART1,CanReBuff);是如何实现的,如果类似Printf的话,那是需要蛮多执行时间的,你可以在中断里面不做具体组包,而是存放到另外一个RxMessage的结构数组里面,然后给处理的任务发送一个消息。
to 二楼:应该不是帧头帧尾的问题,在即收即发的情况下是正确的,就是这样组包后就有问题了
to 三楼:即使是需要时间也不会重复吧?
to 四楼:一直在找类似的程序,一直没找到呢
void USB_LP_CAN_RX0_IRQHandler(void)
{
while(CAN_MessagePending(CAN_FIFO0))
{
CAN_Receive(CAN_FIFO0, &CanMsg[CanMsgEnd]);
if( ++CanMsgEnd >= CAN_RxSize) CanMsgEnd=0;
}
CAN_FIFORelease(CAN_FIFO0);
OSQPost(OSQCanRec,(void*)CAN_REC);
}