搜索

[C语言] 结构体赋值???

[复制链接]
545|15
 楼主 | 2020-3-23 10:12 | 显示全部楼层 | 奖励家园币|阅读模式
如题,typedef struct{
    uint8_t sof; // 起始符
    union {
        struct
        {
            uint8_t devtype;                  // 设备类型
            uint8_t devno[HZ_DEVNO_LENGTH];   // 设备地址
            uint8_t vendor[HZ_VENDOR_LENGTH]; // 厂商代码
        } u;
        uint8_t addr[HZ_ADDR_LENGTH]; // 地址码
    } alladdr;
    uint8_t ctrlcode; // 控制码
    uint8_t len;      // 数据长度
    uint8_t data[128]; // 帧数据
} HZ_Frame;


使用特权

评论回复
 楼主 | 2020-3-23 10:20 | 显示全部楼层 | 奖励家园币
条件是:
1、HZ_Frame *frame;
2、frame = (HZ_Frame *)p;
3、p是串口接收到的20个字节,如“EF EF EF EF 68 01 04 00 01 20 20 00 00 24 06 E5 04 00 08 01 80 4A 16”;
4、其中0x68// 帧起始符;0x16// 帧结束符

使用特权

评论回复

评论

xch 2020-3-24 11:06 回复TA
指针类型强制转换能对齐?HZ_Frame 指针应该是默认32位对齐的吧? 如果不能,则转换非法。 
 楼主 | 2020-3-23 10:22 | 显示全部楼层 | 奖励家园币
frame = (HZ_Frame *)p;???
我赋值赋不过去啊,按顺序赋值吗?

使用特权

评论回复
| 2020-3-23 10:32 | 显示全部楼层 | 奖励家园币
多学C语言 ,看一些公开协议的代码

使用特权

评论回复
| 2020-3-23 13:51 | 显示全部楼层 | 奖励家园币
应该可以指针赋值的,不过还要注意字节对齐和大小端的问题。

使用特权

评论回复
| 2020-3-24 08:40 | 显示全部楼层 | 奖励家园币
语法上没发现有什么问题,编译器提示什么错误?

使用特权

评论回复
| 2020-3-24 11:13 | 显示全部楼层 | 奖励家园币
结构体内成员的物理地址不是连续摆放的。对齐的。所以无法强制转换。别偷懒

使用特权

评论回复
 楼主 | 2020-3-24 13:44 | 显示全部楼层 | 奖励家园币
xch 发表于 2020-3-24 11:13
结构体内成员的物理地址不是连续摆放的。对齐的。所以无法强制转换。别偷懒

...

多谢

使用特权

评论回复
| 2020-3-24 15:13 | 显示全部楼层 | 奖励家园币
顶一个

使用特权

评论回复
| 2020-3-26 09:12 | 显示全部楼层 | 奖励家园币
这是电表数据帧吗

使用特权

评论回复
| 2020-3-26 10:22 | 显示全部楼层 | 奖励家园币
感觉没啥问题,可以赋值啊

使用特权

评论回复
| 2020-3-26 11:14 | 显示全部楼层 | 奖励家园币
可以赋值,不能直接强制转换就换一个指针类型中转一下

使用特权

评论回复
 楼主 | 2020-3-26 14:47 | 显示全部楼层 | 奖励家园币

是的

使用特权

评论回复
 楼主 | 2020-3-26 14:50 | 显示全部楼层 | 奖励家园币
本帖最后由 772671294 于 2020-3-26 14:55 编辑
yklstudent 发表于 2020-3-26 10:22
感觉没啥问题,可以赋值啊

是可以,代码我贴的不全;我提问,是不了解结构体赋值,
1                2                      3              4                             5                                6                   7
设备类型     00(保留)      通道号        绑定传感器数量        绑定的传感器地址        校验1位        固定不变;
68 01 04 00 01 20 20 00 00 24 06 E5这一段不知道是什么时候赋值的,赋到哪里了
如果赋值
typedef struct{
    uint8_t sof; // 起始符                                                                0X68--OK
    union {
        struct
        {
            uint8_t devtype;                  // 设备类型                            "1"--OK
            uint8_t devno[HZ_DEVNO_LENGTH];   // 设备地址             ?
            uint8_t vendor[HZ_VENDOR_LENGTH]; // 厂商代码            ?
        } u;
        uint8_t addr[HZ_ADDR_LENGTH]; // 地址码                           ?
    } alladdr;
    uint8_t ctrlcode; // 控制码                                                          ?
    uint8_t len;      // 数据长度                                                       ?
    uint8_t data[128]; // 帧数据                                                     ?
} HZ_Frame
还是说串口接收的都放uint8_t data[128]; // 帧数据 中,但是整个代码其它地方我没看到对其它?赋值


使用特权

评论回复
| 2020-3-26 18:48 | 显示全部楼层 | 奖励家园币
772671294 发表于 2020-3-26 14:50
是可以,代码我贴的不全;我提问,是不了解结构体赋值,
1                2                      3      ...

就没看懂你说啥

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /4 下一条

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