5793|5

91

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CAN分帧接收问题 [复制链接]

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

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

}
此帖出自stm32/stm8论坛

最新回复

                                 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
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 是不是帧头帧尾的原因造成的
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 不知你USART_PutStr(USART1,CanReBuff);是如何实现的,如果类似Printf的话,那是需要蛮多执行时间的,你可以在中断里面不做具体组包,而是存放到另外一个RxMessage的结构数组里面,然后给处理的任务发送一个消息。
此帖出自stm32/stm8论坛
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 再找个程序对比一下
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(中级)

5
 
to 二楼:应该不是帧头帧尾的问题,在即收即发的情况下是正确的,就是这样组包后就有问题了
to 三楼:即使是需要时间也不会重复吧?
to 四楼:一直在找类似的程序,一直没找到呢
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
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);
}
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表