打印
[应用相关]

CAN一次最多发多少字节数据?

[复制链接]
12558|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FreeDoor|  楼主 | 2009-6-3 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下

TestStatus CAN_Polling(void)
{
  u32 i = 0;
  u8  m=0;  //每次发送的字节数
  u8  n=0;  //总的发送的字节数
  u8 p;  //清空缓存用
  u8 TransmitMailbox;  //发送邮箱

  TxMessage.StdId=0x11;  //对方ID码
  TxMessage.RTR=CAN_RTR_DATA;  //数据帧
  TxMessage.IDE=CAN_ID_STD;  //标准帧
  TxMessage.DLC=8;  //每次放8个字节,三次发24个
 
  for(;n<24;m++,n++)
  {
      TxMessage.Data[m]=n;//CAN_SendDataTab[n];
      while(m==8)
         { 
           m=0;
           TransmitMailbox=CAN_Transmit(&TxMessage);//开始发送数据
         i = 0;
           //检测是否发送成功
         while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF))
            {
            i++;//若发送255次仍失败则自动CAN复位
            }
                i = 0;
           while((CAN_MessagePending(CAN_FIFO0) < 1) && (i != 0xFF))
              {
                i++;
              }
           //CAN数据位清空,留着存下一组八字节
           for(p=0;p<8;p++)
               {
                 TxMessage.Data[p]=0;
               }
  }
  //index=+1;  
  return PASSED; /* 24个字节全部发送成功 */
}

运行结果:00 01 02 03 04 05 06 07。剩下来16字节就没得了
而我想要的是:00 01 02 03 04 05 06 07 00 09 0a 0b 0c 0d 0e 0f 00 11 12 13 14 15 16 17

沙发
ijk| | 2009-6-3 17:37 | 只看该作者

CAN一次最多发多少字节数据?

  CAN一次最多发多少字节数据?正常情况下是8个字节。
出现非预期的结果,就需要调试啦。

使用特权

评论回复
板凳
isd2560| | 2009-6-3 19:33 | 只看该作者

是不是不支持超过8字节的数据呢?

我用CAN那么长时间总感觉只是皮毛,没吃透。那三个邮箱不知道是啥意思?是不是邮箱一满了,填邮箱2,邮箱2满了填了3.3满了后来的数据抛弃或者后来的覆盖前面的。先发送1,2,3等待,然后2,3等待,接下来的跟上,不知道是不是这个理

使用特权

评论回复
地板
walnutcy| | 2009-6-4 00:22 | 只看该作者

CAN数据分包发送吧, 学学IP协议包就理解了

使用特权

评论回复
5
FreeDoor|  楼主 | 2009-6-4 11:28 | 只看该作者

楼上打包后数据占多大字节?怎么计算

俺对IP协议懂的不多,虽然以前学过TCPIP但是没有真正用到过
在网上搜罗一下
  typedef   struct   _packet   
  {   
        char   id;   
        int   iIength;   
        char   cPhone[16];   
        char   cBody[255];   
  }packet;   
  packet   m_packet;   
  ZeroMemory(&m_packet,sizeof(packet));   
  m_packet.id   =   0xfe;   
  m_packet.iIength   =   1+4+16+255;   
  CopyMemory(m_packet.cPhone,"13012345678",11);   
  CopyMemory(m_packet.cBody,"ABCDE",5);  

大概知道打包发送的概念,但是打包后数据包多大,数据包在CAN里面怎么摆呢?要打包后接受方还要根据你包格式最相应处理吧。

使用特权

评论回复
6
511| | 2009-9-7 14:19 | 只看该作者
关注,,,

使用特权

评论回复
7
ST_ARM| | 2009-9-7 17:39 | 只看该作者

问题

本帖最后由 ST_ARM 于 2009-9-7 17:41 编辑

你的程序有问题,好像有一个“}”不见了,我不确定是哪个丢了,如果按你上面写的,“00 01 02 03 04 05 06 07”都不该出现,难道见鬼了?
你的代码整理:
TestStatus CAN_Polling(void)
{
    u32 i = 0;
    u8 m=0;     //每次发送的字节数
    u8 n=0;      //总的发送的字节数
    u8 p;         //清空缓存用
    u8 TransmitMailbox;    //发送邮箱
    TxMessage.StdId=0x11;    //对方ID码
    TxMessage.RTR=CAN_RTR_DATA;    //数据帧
    TxMessage.IDE=CAN_ID_STD;    //标准帧
    TxMessage.DLC=8;    //每次放8个字节,三次发24个

    for(;n<24;m++,n++)
    {
        TxMessage.Data[m]=n;//CAN_SendDataTab[n];
        while(m==8)
        {
            m=0;
            TransmitMailbox=CAN_Transmit(&TxMessage);//开始发送数据
            i = 0;
            //检测是否发送成功
            while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF))
            {
                i++;//若发送255次仍失败则自动CAN复位
            }
            i = 0;
            while((CAN_MessagePending(CAN_FIFO0) < 1) && (i != 0xFF))
            {
                i++;
            }
            //CAN数据位清空,留着存下一组八字节
            for(p=0;p<8;p++)
            {
                TxMessage.Data[p]=0;
            }
        }
        //index=+1;   
        return PASSED; /* 24个字节全部发送成功 */
    }


按照你的流程,程序还没发送就退出了。

使用特权

评论回复
8
香水城| | 2009-9-7 18:12 | 只看该作者
不是有一个“}”不见了,而是最后一个“}”放错地方了,:@

这就是写程序时不对齐 { 与 } 的后果。

使用特权

评论回复
9
grant_jx| | 2009-9-8 12:16 | 只看该作者
CAN协议2.0中有规定,数据帧数据有效位最多是8bytes。也就是一帧你最多可以包含的数据就是8个字节,这8个字节不包含ID、CRC等域。

使用特权

评论回复
10
zdx818| | 2009-9-8 15:42 | 只看该作者
楼上用理。

使用特权

评论回复
11
sunchengjun| | 2011-3-3 21:07 | 只看该作者
学习了

使用特权

评论回复
12
btiger2000| | 2011-3-4 08:25 | 只看该作者
老帖子翻出来了

使用特权

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

本版积分规则

4

主题

10

帖子

0

粉丝