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的时候 我又是对的
这个地方是不是就不能用这个结构体来弄的?
|