打印
[C语言]

结构体赋值???

[复制链接]
1721|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
772671294|  楼主 | 2020-3-23 10:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ui, hz, ADDR, ev, AD
如题,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;


使用特权

评论回复

相关帖子

沙发
772671294|  楼主 | 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位对齐的吧? 如果不能,则转换非法。 
板凳
772671294|  楼主 | 2020-3-23 10:22 | 只看该作者
frame = (HZ_Frame *)p;???
我赋值赋不过去啊,按顺序赋值吗?

使用特权

评论回复
地板
一路向北lm| | 2020-3-23 10:32 | 只看该作者
多学C语言 ,看一些公开协议的代码

使用特权

评论回复
5
WoodData| | 2020-3-23 13:51 | 只看该作者
应该可以指针赋值的,不过还要注意字节对齐和大小端的问题。

使用特权

评论回复
6
shipeng1989| | 2020-3-24 08:40 | 只看该作者
语法上没发现有什么问题,编译器提示什么错误?

使用特权

评论回复
7
xch| | 2020-3-24 11:13 | 只看该作者
结构体内成员的物理地址不是连续摆放的。对齐的。所以无法强制转换。别偷懒

使用特权

评论回复
8
772671294|  楼主 | 2020-3-24 13:44 | 只看该作者
xch 发表于 2020-3-24 11:13
结构体内成员的物理地址不是连续摆放的。对齐的。所以无法强制转换。别偷懒

...

多谢

使用特权

评论回复
9
有一颗橙子| | 2020-3-24 15:13 | 只看该作者
顶一个

使用特权

评论回复
10
光轮TreeOS| | 2020-3-26 09:12 | 只看该作者
这是电表数据帧吗

使用特权

评论回复
11
yklstudent| | 2020-3-26 10:22 | 只看该作者
感觉没啥问题,可以赋值啊

使用特权

评论回复
12
Jenghiz| | 2020-3-26 11:14 | 只看该作者
可以赋值,不能直接强制转换就换一个指针类型中转一下

使用特权

评论回复
13
772671294|  楼主 | 2020-3-26 14:47 | 只看该作者

是的

使用特权

评论回复
14
772671294|  楼主 | 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]; // 帧数据 中,但是整个代码其它地方我没看到对其它?赋值


使用特权

评论回复
15
yklstudent| | 2020-3-26 18:48 | 只看该作者
772671294 发表于 2020-3-26 14:50
是可以,代码我贴的不全;我提问,是不了解结构体赋值,
1                2                      3      ...

就没看懂你说啥

使用特权

评论回复
16
奥斯卡小街| | 2021-11-18 18:21 | 只看该作者
#pragam pack(1)

使用特权

评论回复
17
奥斯卡小街| | 2021-11-18 18:21 | 只看该作者
#pragam pack(1)
#pragam pack

memset();

使用特权

评论回复
18
kissdb| | 2021-11-19 13:07 | 只看该作者
这是用,C语言的union共同体给结构体赋值的,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

49

帖子

0

粉丝