CAN分帧接收问题

liu0911   2010-3-20 16:15 楼主
单帧接收正常,多帧情况下分帧接收时,只能重复收到第一帧,程序如下,数组时分配的是一个足够大的静态数组,不知道怎么回事?

//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); //清除挂起中断 }

}

回复评论 (5)

                                 是不是帧头帧尾的原因造成的
点赞  2010-3-20 20:27
                                 不知你USART_PutStr(USART1,CanReBuff);是如何实现的,如果类似Printf的话,那是需要蛮多执行时间的,你可以在中断里面不做具体组包,而是存放到另外一个RxMessage的结构数组里面,然后给处理的任务发送一个消息。
点赞  2010-3-21 21:59
                                 再找个程序对比一下
点赞  2010-3-21 22:44
to 二楼:应该不是帧头帧尾的问题,在即收即发的情况下是正确的,就是这样组包后就有问题了
to 三楼:即使是需要时间也不会重复吧?
to 四楼:一直在找类似的程序,一直没找到呢
点赞  2010-3-22 08:49
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);
}
点赞  2010-3-23 11:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复