老师这样理解是正确的吗?

来源:3-7 运算符-2【难点突破】

慕丝4305819

2023-12-13

//备 注:摩托罗拉格式
typedef union
{

 
  struct
  {
    uint8 t  RemoteCtrlwinLF  :2;//左前车窗控制
    uint8 t  RemoteCtrlwinRF  :2;//右前车窗控制
    uint8 t  RemoteCtrlwinLR  :2;//左后车窗控制
    uint8 t  RemoteCtrlwinLR  :2;//右后车窗控制
}Bits1;
}DRM_1;

UINT8 u8Para1;//定义一个8位的变量来存储
//车窗控制共计有4个子功能,在一个字节里面分别占2位;我们需要取一个字节里面的对应的位来实现数据的传输解析
//常用方法   "<<"  " >>"  "&"  "|" 左移  右移 与  或 
//解读分析: 上面的结构体一个字节8位都占用了。
1.需要取"RemoteCtrlwinLF"信号
分析:它在8位里面占用了高2位,那么我们可以把不要的位都置0,剩下的用 '&' 拿出来。
"RemoteCtrlwinLF"信号占bits1的高两位,转换成16进制:0x03;
用:0000 0011 与运算 1111 1111;因此只有后面两位"1 1"与运算为真,保留,其它的为假则舍掉。
转换成代码:tCanMsgTBOX 011. RemoteCtrlwinLF = (uint8 t)(u8Para1 & 0x03u);

2.需要取"RemoteCtrlwinRF"信号
分析:它在8位信号中占次高两位,这个时候可以用移位操作,">>"右移两位,它上两位被"RemoteCtrlwinLF"信号占用但是不需要用它,就可以用右移把它拿掉,用"RemoteCtrlwinRF"信号代替它的位置,在低位部分补"0",再用与运算就可以拿出"RemoteCtrlwinRF"信号值;
即:"1111 1111"用右移去掉高两位,那么"RemoteCtrlwinRF"信号就成了高位,用0补齐低位,"0011 1111"; 用"0000 0011"与运算"0011 1111"就可以拿出;
转换成代码:tCanMsgTBOX 011. RemoteCtrlwinRF = (uint8_t)((u8Para1 >> 2U) & 0x03U)。
以此类推:取"RemoteCtrlwinLR","RemoteCtrlwinLR"的代码转换如下:
tCanMsgTBOX 011. RemoteCtrlwinLR = (uint8_t)((u8Para1 >> 4U) & 0x03u);
tCanMsgTBOX 011. RemoteCtrlwinR = (uint8 t)((u8Para1 >> 6U) & 0x03u);
写回答

1回答

bennyhuo

2023-12-14

Bits1 占 8 bit,从高到低依次对应其中的四个字段,这四个字段各自只占 2 bit。

例如:

DRM_1 drm_1 = {
    .Bits1 = {
        .RemoteCtrlwinLF = 0,
        .RemoteCtrlwinRF = 1,
        .RemoteCtrlwinLR = 2,
        .RemoteCtrlwinRR = 3
    }
};

这样 drm_1 这个变量的内存值是 e4,即  1011 0100,C 是小端序,对应的

10 11 01 00

LR RR RF LF


同学可以参考这个再来想想你的问题怎么处理哈。后面的格式有点儿乱,问题部分我看着有点儿费劲。要不你重新整理一下问题也可以。

0
2
bennyhuo
回复
慕丝4305819
temp接收值,为什么写到了=的右面?
2023-12-15
共2条回复

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程