打印

CAN分帧接收问题

[复制链接]
3995|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiqimao2010|  楼主 | 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[i]);}}
   
   if (RxMessage.Data[0]&0x41==0x41) {//多帧的第一帧
   
                  for (i = 0; i < 8; i++) {
                                CanReBuff[l++]=RxMessage.Data[i]; }
      
   }
    if (RxMessage.Data[0]&0x80==0x80 ) {//多帧的中间帧
   
                 for (i = 0; i < 8; i++) {
                                 CanReBuff[l++]=RxMessage.Data[i]; }
   }
    if (RxMessage.Data[0]&0xC0==0xC0)  //多帧的最后一帧,接收完成后向串口发送该多帧
   {
     
               for (i = 0; i < 8; i++) {
                                 CanReBuff[l++]=RxMessage.Data[i];
  }
             USART_PutStr(USART1,CanReBuff);
   
}
CAN_ClearITPendingBit(CAN_IT_FMP0); //清除挂起中断 }

}
沙发
yybj| | 2010-3-20 20:27 | 只看该作者
是不是帧头帧尾的原因造成的

使用特权

评论回复
板凳
sunxflower| | 2010-3-21 21:59 | 只看该作者
不知你USART_PutStr(USART1,CanReBuff);是如何实现的,如果类似Printf的话,那是需要蛮多执行时间的,你可以在中断里面不做具体组包,而是存放到另外一个RxMessage的结构数组里面,然后给处理的任务发送一个消息。

使用特权

评论回复
地板
司徒老鹰| | 2010-3-21 22:44 | 只看该作者
再找个程序对比一下

使用特权

评论回复
5
jiqimao2010|  楼主 | 2010-3-22 08:49 | 只看该作者
to 二楼:应该不是帧头帧尾的问题,在即收即发的情况下是正确的,就是这样组包后就有问题了
to 三楼:即使是需要时间也不会重复吧?
to 四楼:一直在找类似的程序,一直没找到呢

使用特权

评论回复
6
sunxflower| | 2010-3-23 11:24 | 只看该作者
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);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

1

粉丝