微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > CAN接收报文问题,莫名多出来了一个3

CAN接收报文问题,莫名多出来了一个3

时间:10-02 整理:3721RD 点击:
我的程序如下:问题是我发送的是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(!(CRGFLG&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_TFLG1 = 0xff;            // 清除各IC/OC中断标志位
  ECT_TFLG2 = 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 */
}

你发送的是字符,不是数字,字符码31 30 30 38 36 31 31 30对应的字符就是1、0、0、8、6、1、1、0。


谢谢,老哥问题已经解决了!发送文字的时候是不是需要加单引号呢?

字符、字符串:只有图形意义,没有数字意义
unsigned char senddata[8]={'1','0','0','8','6','1','1','0'};//字符
unsigned char senddata[]="10086110";                        //字符串
unsigned char senddata[]={"欢迎光临"};                        //字符串
unsigned char senddata[]={0,1,2,3,4,5,6,7,8,9};        //数字

学到了!谢谢老哥!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top