上位机与Modbus的32位数据交互
假如由Modbus TCP
发出数据 0xAABBCCDD
,上位机收到的字节流为 CC DD AA BB
。
在小端模式下,如果用2个uint16
结构体解析此数据流,结果如下:
struct Foo
{uint16 r1;uint16 r2;
};char buffer[] = {0xCC, 0xDD, 0xAA, 0xBB};
struct Foo fo = *(struct Foo*)(buffer);assert(fo.r1 = 0xCCDD);
assert(fo.r2 = 0xAABB);
而如果用int32接收,因为低位地址在前,结果如下:
uint32 r = *(uint32*)(buffer)
assert(r == 0xBBAADDCC);
要得到原数,就需要调节字节顺序,
// 将由Modbus转换而来的32位数,转换到本机表示。
inline uint32 SwapByteInt32(uint32 v)
{// BBAADDCC => AABBCCDDreturn ((v & 0xFF000000) >> 8) |((v & 0x00FF0000) << 8) |((v & 0x0000FF00) >> 8) |((v & 0x000000FF) << 8);
}
同样,在上位机这边,如果要向Modbus
写入一个32位值(这里值写入一个缓冲区):
void writeInt32(uint32 v)
{// AABBCCDD => [CC DD AA BB]buf[0] = (uint8)((v & 0x0000FF00) >> 8);buf[1] = (uint8)((v & 0x000000FF));buf[2] = (uint8)((v & 0xFF000000) >> 24);buf[3] = (uint8)((v & 0x00FF0000) >> 16);
}