迪文科技论坛

 找回密码
 立即注册
搜索
查看: 443|回复: 9

【提问】CAN接收到的数据,2个字节合成后怎么不对呀?

[复制链接]

12

主题

45

回帖

466

积分

中级会员

Rank: 3Rank: 3

积分
466
发表于 2022-3-7 20:33:24 | 显示全部楼层 |阅读模式
各位老师       用论坛上的例程代码做试验,接收用CAN信号发送器发到CAN线上的数据,2个字节合成后就是不对呀:具体如下:8字节数据rx-buf[4]---rx-buf[11] 分别是  70 17 00 00 00 00 00 00 ,其中rx-buf[4]位上的70是16位字的低字节,rx-buf[5]位上的17是高字节,则0x1770应是10进制的6000,在代码中用  unsigned int heshu=(((unsigned char)(rx-buf[4]<<0)  |  ((unsigned char)(rx-buf[5]<<8)); 显示到屏write_dgus(0x2000,2,unsigned char*)&heshu);怎么也显示不出呀?请给与指导,谢谢!


回复

使用道具 举报

0

主题

212

回帖

1895

积分

金牌会员

Rank: 6Rank: 6

积分
1895
发表于 2022-3-8 10:21:51 | 显示全部楼层
楼主方便发一下源码和DGUS工程吗?
回复

使用道具 举报

0

主题

12

回帖

955

积分

高级会员

Rank: 4

积分
955
发表于 2022-3-8 11:19:37 | 显示全部楼层
两个潜在问题.
1.你这个 是不是 数据格式用错了.rx_buf是char型吗?
你左移8位,直接为0了.高位数据直接就没了.在rx_buf前面加个强制装换(unsigned int),.
现在显示的现象是不是只有低位.显示?
2.C51的unsigned int是两个字节,你write_dgus是写的两个字节,还是两个字(4字节)?
如果写的两个字,数据就放在0x2001了.显示空间按字显示,的地址就得为0x2001
回复

使用道具 举报

12

主题

45

回帖

466

积分

中级会员

Rank: 3Rank: 3

积分
466
 楼主| 发表于 2022-3-8 11:27:50 | 显示全部楼层
谢谢!我先试下,有问题再请教!
回复

使用道具 举报

12

主题

45

回帖

466

积分

中级会员

Rank: 3Rank: 3

积分
466
 楼主| 发表于 2022-3-8 15:42:42 | 显示全部楼层
您好:又试了,还是不行呢!多试了几个写的字长和屏上的数据,结果见图片,请百忙中给予指导!谢谢!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

12

回帖

955

积分

高级会员

Rank: 4

积分
955
发表于 2022-3-8 17:42:15 | 显示全部楼层
1.先定位问题把,先不考虑CAN,直接原数据没问题的情况下,调用write_dgus是否显示有问题.  DGUS变量是按字变量(2个字节)计数,你写2个8位的数,如果传入参数是字长,长度就只用写1.如果传参是字节长,才写2.
按你的使用习惯,你都是传的字节长.如果是这样,你用我的压缩包里的接口试下.

把write_dgus 的接口内容,用这个WriteDGUS里的替换下,看看.

确认接口调用没有问题,先
  1. /*****************************************************************************
  2. 写DGUS寄存器*/
  3. /*****************************************************************************
  4. 函 数 名  : WriteDGUS
  5. 功能描述  : 读DGUS寄存器
  6. 输入参数  : uint16_t Addr  DGUS寄存器地址
  7.              uint8_t* pBuf  接收缓冲区
  8.              uint16_t Len   写入数据字节长度(先高字再低字)
  9. 输出参数  : 无
  10. 修改历史  :
  11. 日    期  : 2019年11月04日
  12. 作    者  :
  13. 修改内容  : 创建
  14. *****************************************************************************/
  15. void WriteDGUS(uint16_t Addr, uint8_t *pBuf, uint16_t Len)
  16. {
  17.   uint8_t Aoffset;
  18.   if(NULL == pBuf){return;}
  19.   if(0 == Len){return;}
  20.   if((Addr+Len/2) > (0xFFFF*2)){return;}
  21.   Aoffset = Addr&0x01;                 //取bit0作为奇偶判断
  22.   Addr  = Addr >> 1;                   //配置地址
  23.   ADR_H = (uint8_t)(Addr >> 16);
  24.   ADR_M = (uint8_t)(Addr >> 8);
  25.   ADR_L = (uint8_t)(Addr);
  26.   RAMMODE = 0x00;
  27.   ADR_INC = 0x01;
  28.   APP_REQ = 1;                         //占用DGUS读写
  29.   while(!APP_ACK);
  30.   APP_RW  = 0;                         //写变量存储器

  31.   if(1 == Aoffset)
  32.   {                    //地址为奇数
  33.     if(1 == Len){ APP_DATA3=0,APP_DATA2=0,APP_DATA1=1,APP_DATA0=0;}
  34.     else{         APP_DATA3=0,APP_DATA2=0,APP_DATA1=1,APP_DATA0=1;}
  35.     if(1 == Len){ DATA1=*pBuf++;Len=Len-1; }
  36.     else{         DATA1=*pBuf++;DATA0=*pBuf++;Len=Len-2;}
  37.     APP_EN  = 1;
  38.     while(APP_EN);
  39.   }
  40.   while(1)             //地址为偶数
  41.   {
  42.     if(0 == Len) break;
  43.     if(Len < 4)
  44.     {
  45.       switch(Len)
  46.       {
  47.         case 3: APP_DATA3=1,APP_DATA2=1,APP_DATA1=1,APP_DATA0=0;break;
  48.         case 2: APP_DATA3=1,APP_DATA2=1,APP_DATA1=0,APP_DATA0=0;break;
  49.         case 1: APP_DATA3=1,APP_DATA2=0,APP_DATA1=0,APP_DATA0=0;break;
  50.       }
  51.       switch(Len)
  52.       {
  53.         case 3: DATA3=*pBuf++;DATA2=*pBuf++;DATA1=*pBuf++;break;
  54.         case 2: DATA3=*pBuf++;DATA2=*pBuf++;break;
  55.         case 1: DATA3=*pBuf++;break;
  56.       }
  57.       APP_EN  = 1;
  58.       while(APP_EN);
  59.       break;
  60.     }
  61.     else
  62.     {
  63.       APP_DATA3=1,APP_DATA2=1,APP_DATA1=1,APP_DATA0=1;
  64.       DATA3=*pBuf++;DATA2=*pBuf++;DATA1=*pBuf++;DATA0=*pBuf++;
  65.       APP_EN  = 1;
  66.       while(APP_EN);
  67.       Len = Len - 4;
  68.     }
  69.   }

  70.   RAMMODE = 0x00;                      //不占用时必须清零
  71. }
复制代码




回复

使用道具 举报

12

主题

45

回帖

466

积分

中级会员

Rank: 3Rank: 3

积分
466
 楼主| 发表于 2022-3-8 18:44:54 | 显示全部楼层
谢谢!先仔细学习下您给的代码!
回复

使用道具 举报

12

主题

45

回帖

466

积分

中级会员

Rank: 3Rank: 3

积分
466
 楼主| 发表于 2022-3-10 15:42:05 | 显示全部楼层
tyrjj112100 发表于 2022-3-8 17:42
1.先定位问题把,先不考虑CAN,直接原数据没问题的情况下,调用write_dgus是否显示有问题.  DGUS变量是按字变 ...

您好:是您分析的显示函数的问题,直接给数字0X1770,显示不出6000,但复制您这个显示函数到代码中,编译报错(想传报错图片,就是传不上来),改用这个函数,其中的变量名还要定义变量类型吗?如Len?谢谢再给指导!
回复

使用道具 举报

12

主题

45

回帖

466

积分

中级会员

Rank: 3Rank: 3

积分
466
 楼主| 发表于 2022-3-10 16:29:09 | 显示全部楼层
编译报错的图片!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

12

回帖

955

积分

高级会员

Rank: 4

积分
955
发表于 2022-3-11 10:45:03 | 显示全部楼层
PBUF 是传参的定义,你把之前的传参,用这个名字替换下,LEN也是.APP_DATA3就是之前的data3,编译错误就是名字没对应上,对应上就行了.
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-4-7 07:20 , Processed in 0.084539 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表