405|3

6

帖子

0

资源

一粒金砂(中级)

遇到难点,两个8位数据,拼接成一个16位数据失败 [复制链接]

单片机串口2发来的数据,unsigned char型,存放在一个数组unsigned char xdata Rec_Buf2[50]中:

 

Rec_Buf2[50]中的数据为:

DD 03 00 1B 0B 60 00 00 00 F8 01 04 00 00 29 83 00 00 00 00 00 00 28 5F 01 07 02 0B AA 0B A6 FB DA 77

 

现在要做的是:提取出Rec_Buf2[ ]中0B 60两个数,存入unsigned int  BMSdata[ ]数组中格式为0x0B60

 

使用语句BMSdata[0]|=((Rec_Buf2[4]&0xFF)<<8)|(Rec_Buf2[5]&0xFF); 发现结果不对,仿真后发现BMSdata[0]中的数据为0x0000而不是期望中的0x0B60。   请各位大佬帮忙看看,问题出在哪里了。

 

此帖出自51单片机论坛

回复

5917

帖子

209

资源

版主

代码是看不出有什么问题,赋值别用|=,直接用=

点评

换成=也不行  详情 回复 发表于 2020-12-21 22:09
个人签名

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵


回复

703

帖子

2

资源

版主

((Rec_Buf2[4]&0xFF)<<8)|(Rec_Buf2[5]&0xFF); 

你把这里的“|”改成+试一下。


回复

1472

帖子

0

资源

纯净的硅(高级)

或者多加一级缓存吧,用两个变量把两个数组元素放进去,然后再执行移位和合并,这两个变量建议用uint定义


回复

3374

帖子

1

资源

版主

本帖最后由 damiaa 于 2020-12-21 12:58 编辑

(Rec_Buf2[4]&0xFF)<<8)|  8位的数据怎么整还是8位的 所以移位后数据不对了:为0。 先要整成16位的

 

BMSdata[0]|=(((uint16_t)Rec_Buf2[4])<<8) | ((uint16_t)Rec_Buf2[5]);

点评

改成BMSdata[0] =(((uint16)Rec_Buf2[4])<<8) | ((uint16)Rec_Buf2[5]);运行后BMSdata[0]的值还是0,。并且Rec_Buf2[4],Rec_Buf2[5]都是有值的,分别是0x0B,0X55  详情 回复 发表于 2020-12-21 22:13

回复

6

帖子

0

资源

一粒金砂(中级)

lcofjp 发表于 2020-12-21 09:08 代码是看不出有什么问题,赋值别用|=,直接用=

换成=也不行


回复

6

帖子

0

资源

一粒金砂(中级)

damiaa 发表于 2020-12-21 12:55 (Rec_Buf2[4]&0xFF)<<8)|  8位的数据怎么整还是8位的 所以移位后数据不对了:为0。 先要整成16 ...

改成BMSdata[0] =(((uint16)Rec_Buf2[4])<<8) | ((uint16)Rec_Buf2[5]);运行后BMSdata[0]的值还是0,。并且Rec_Buf2[4],Rec_Buf2[5]都是有值的,分别是0x0B,0X55


回复

3374

帖子

1

资源

版主

本帖最后由 damiaa 于 2020-12-22 09:55 编辑
mige062 发表于 2020-12-21 22:13 改成BMSdata[0] =(((uint16)Rec_Buf2[4])<<8) | ((uint16)Rec_Buf2[5]);运行后BMSdata[0]的值还是0, ...

那你拆分一下   一步一步看结果,好了以后再整合。

unsigned char Rec_buf2[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00};
unsigned int BMSdata[5]={0};
unsigned int val1,val2;
int main(void)
{
//    val1 =Rec_buf2[4];
//    val1 <<=8;
//    printf("val1 = %x\n",val1);
//    val2 = Rec_buf2[5] ;
//    printf("val2 = %x\n",val2);
//    val2 = val1 | val2 ;
//    printf("val2 = %x\n",val2);
//    BMSdata[0] =val2;
    BMSdata[0] =(((unsigned int) Rec_buf2[4])<<8) | ((unsigned int) Rec_buf2[5]);
    printf("BMSdata[0] = %x\n",BMSdata[0]);

}

2.png

1.png

 


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/7 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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