硬汉嵌入式论坛

 找回密码
 立即注册
查看: 705|回复: 2
收起左侧

大端字节序和小端字节序问题

[复制链接]

33

主题

188

回帖

287

积分

高级会员

积分
287
发表于 2024-7-3 17:58:56 | 显示全部楼层 |阅读模式
STM32F429上实现了modbus从机
寄存器只实现了保持寄存器。
原先是用的定义 uint16_t的数据
后来不知道听谁说的用结构体更方便 不用进行数据处理。
我一想也对哦
然后就定义了一个联合体

[C] 纯文本查看 复制代码

#include <stdio.h>
#include <stdint.h>
#include <string.h>

typedef struct
{
  uint8_t SlaveId;
  uint8_t BaudRate;
  uint8_t Reserved1[14];

  char SN[8];
  uint8_t Version[3];
  uint8_t Reserved2[5];

  uint32_t SensorData;
  uint8_t SensorStatus;
  uint8_t Reserved[11];
} Modbus_HoldReg_Data_Unpacked_TypeDef;

typedef struct __attribute__((__packed__))
{
  uint8_t SlaveId;
  uint8_t BaudRate;
  uint8_t Reserved1[14];

  char SN[8];
  uint8_t Version[3];
  uint8_t Reserved2[5];

  uint32_t SensorData;
  uint8_t SensorStatus;
  uint8_t Reserved[11];
} Modbus_HoldReg_Data_TypeDef;

typedef union
{
  Modbus_HoldReg_Data_TypeDef data;
  uint8_t bytes[sizeof(Modbus_HoldReg_Data_TypeDef)];
} Modbus_HoldReg_TypeDef;

Modbus_HoldReg_TypeDef HoldReg;

uint16_t GetHoldRegData(uint16_t RegAdd)
{
  uint16_t wRegValue = 0;
  wRegValue += (HoldReg.bytes[2 * (RegAdd)] << 8) & 0xFFFF;
  wRegValue += HoldReg.bytes[2 * (RegAdd) + 1] & 0xFFFF;
  return wRegValue;
}

int main()
{
  uint16_t x;
  HoldReg.data.SensorData = 0x12345678;
  x = GetHoldRegData(16);
  printf("0x%04X\n", x);
  x = GetHoldRegData(17);
  printf("0x%04X\n", x);
  memcpy(HoldReg.data.SN, "ABCDEFGH", 8);

  x = GetHoldRegData(8);
  printf("0x%04X\n", x);
  x = GetHoldRegData(9);
  printf("0x%04X\n", x);
  x = GetHoldRegData(10);
  printf("0x%04X\n", x);
  x = GetHoldRegData(11);
  printf("0x%04X\n", x);

  for (int i = 0; i < sizeof(HoldReg); i++)
  {
    printf("%02u>>%02X\n", i, HoldReg.bytes);
  }
  return 0;
}



业务里面读写都是用HoldReg.data直接读写
RS485传输的时候用GetHoldRegData给HoldReg.byte对应数据

然后问题来了
读寄存器SensorData的时候 我想的是返回给我12 34 56 78 实际读到的是78 56 34 12
读SN的时候 我又是对的

这个地方是不是就不能用这个结构体来弄的?



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115653
QQ
发表于 2024-7-4 09:24:46 | 显示全部楼层
这种的适合自己的产品Modbus组网使用,发生的时候使用这个结构体发生,接收端接收到所有数据后,结构体强制类型转换获取全部。

不好兼容标准的modbus产品,modbus数据部分是大端格式化,CRC部分是小端格式。
回复

使用道具 举报

33

主题

188

回帖

287

积分

高级会员

积分
287
 楼主| 发表于 2024-7-4 09:39:18 | 显示全部楼层
eric2013 发表于 2024-7-4 09:24
这种的适合自己的产品Modbus组网使用,发生的时候使用这个结构体发生,接收端接收到所有数据后,结构体强制 ...

没办法,只有修改了
uint32_t都改成uint8_t xx[4]
转换也麻烦
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-9 22:26 , Processed in 0.330918 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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