关于CAN报文的问题

[复制链接]
5898|47
 楼主| 谢谢谢林达 发表于 2017-7-27 14:42 | 显示全部楼层 |阅读模式
我的程序如下:问题是我发送的是10086110这八个数,但是在CAN接收端接收到的数据是31 30 30 38 36 31 31 30,为啥是这样呢?前边的3是什么呢?#include <hidef.h>      /* common defines and macros */#include "derivative.h"      /* derivative-specific definitions */
#include "CANsend.h"


#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK    32000000           //总线频率
#define OSC_CLOCK    16000000           //晶振频率
#define ID   0x0019                     //发送ID
#define data_len_TX        8            //发送数据长度

unsigned char k;
unsigned senddata[8]={'1','0','0','8','6','1','1','0'};      //发送的数据

struct can_msg msg_send;
unsigned char datain=0;  


void INIT_PLL(){                  //初始化锁相环
  CLKSEL &=0x7f;                   //设置OSCCLK为系统时钟
  PLLCTL &=0x8F;                   //禁止PLL
  CRGINT &=0xDF;

  #if(BUS_CLOCK==32000000)
     SYNR=0x43;
  #elif(BUS_CLOCK==24000000)
     SYNR=0x42;
  #endif

  REFDV=0x81;
  PLLCTL |=0x70;                   //使能PLL
  asm NOP;
  asm NOP;
  while(!(CRG**&0x08));           //PLL锁定
          CLKSEL |=0x80;           //设置PLL为系统时钟
}



/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  ECT_TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  ECT_TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  ECT_TIOS  = 0xff;      //指定所有通道为输出比较方式
  ECT_TCTL1 = 0x00;            // 后四个通道设置为定时器与输出引脚断开
  ECT_TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  ECT_DLYCT = 0x00;            // 延迟控制功能禁止
  ECT_ICOVW = 0x00;            // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖
  ECT_ICSYS = 0x00;            // 禁止IC及PAC的保持寄存器
  ECT_TIE   = 0x00;     // 禁止所有通道定时中断
  ECT_TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  ECT_T**1 = 0xff;            // 清除各IC/OC中断标志位
  ECT_T**2 = 0xff;     // 清除自由定时器中断标志位
}


/************************************************************/
/*                    中断接收函数                          */
/************************************************************/
//#pragma CODE_SEG __NEAR_SEG NON_BANKED
//void interrupt CAN_receive(){
//  if(CAN0GetMsg(&Msg)){
//     if(msg_get.id == ID && (!msg_get.RTR)){
//       LEDCPU=~LEDCPU;
//       datain=1;
//     }
//  }
//  else{
//    for(;;);
//  }
//}
//#pargma CODE_SEG DEFAULT


void main(void) {
  /* put your own code here */
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  INIT_CAN0();
  LEDCPU_dir=1;
  LEDCPU=0;
  EnableInterrupts;

msg_send.id = ID;
  for(k=0;k<data_len_TX;k++){
    msg_send.data[k] = senddata[k];
  }
  msg_send.len = data_len_TX;
  msg_send.RTR = FALSE;
  msg_send.prty= 0;  
  for(;;) {

     if(!MSCAN0SendMsg(msg_send))
     for(;;);
     else
      LEDCPU=~LEDCPU;
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2017-7-27 18:44 | 显示全部楼层
你用的什么单片机?
cehuafan 发表于 2017-7-27 22:40 | 显示全部楼层
{'1','0','0','8','6','1','1','0'}  对应31 30 30 38 36 31 31 30
232321122 发表于 2017-7-27 22:40 | 显示全部楼层
这是16进制的数据。
uptown 发表于 2017-7-27 22:41 | 显示全部楼层
楼主没有搞明白这个对应关系吗?
xiaoyaozt 发表于 2017-7-27 22:42 | 显示全部楼层
这个can通信的数据都是对应的。
mnynt121 发表于 2017-7-27 23:00 | 显示全部楼层
这个前面的是0x30+
10299823 发表于 2017-7-27 23:00 | 显示全部楼层
转换为字符串看就对了。
kmzuaz 发表于 2017-7-27 23:01 | 显示全部楼层
你查看一下asicII就明白了。
51xlf 发表于 2017-7-27 23:01 | 显示全部楼层
这个没有错误,接收结果正确。
51xlf 发表于 2017-7-27 23:02 | 显示全部楼层
unsigned senddata[8]={ 1, 就对了
chenci2013 发表于 2017-7-27 23:02 | 显示全部楼层
10086110这八个数对应31 30 30 38 36 31 31 30
cehuafan 发表于 2017-7-27 23:03 | 显示全部楼层
你发送的是asic码。
232321122 发表于 2017-7-27 23:03 | 显示全部楼层
“1”就是0x31
uptown 发表于 2017-7-27 23:03 | 显示全部楼层
字符和16进制是对应的。
xiaoyaozt 发表于 2017-7-27 23:03 | 显示全部楼层
你发送0x01试试。
mnynt121 发表于 2017-7-27 23:03 | 显示全部楼层
‘1’=0x30+1
10299823 发表于 2017-7-27 23:03 | 显示全部楼层
数据没有对应好而已。
kmzuaz 发表于 2017-7-27 23:03 | 显示全部楼层
如果是发送数字,就使用对应的数据。
51xlf 发表于 2017-7-27 23:03 | 显示全部楼层
楼主把16进制和十进制搞错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

79

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部