MS-DTU/MS-DTU-V1/User/utils.c

84 lines
1.5 KiB
C
Raw Permalink Normal View History

2025-04-03 14:18:58 +08:00
#include "includes.h"
// <20>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>˳<EFBFBD><CBB3>
uint16_t ntohs(uint16_t n)
{
uint8_t b1 = n >> 8;
uint8_t b0 = n & 0xFF;
return (b0 << 8) | b1;
}
uint32_t ntohl(uint32_t n)
{
uint8_t b3 = n >> 24;
uint8_t b2 = (n >> 16) & 0xFF;
uint8_t b1 = (n >> 8) & 0xFF;
uint8_t b0 = n & 0xFF;
return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
}
float ntohf(float f)
{
uint32_t n;
float v;
memmove(&n, &f, 4);
n = ntohl(n);
memmove(&v, &n, 4);
return v;
}
uint16_t Byte2IntS(uint8_t *buf, int pos)
{
return (uint16_t)(buf[pos] | (buf[pos + 1] << 8));
}
void Int2ByteS(uint8_t *buf, int pos, uint16_t val)
{
buf[pos] = (uint8_t) (val & 0xFF);
buf[pos + 1] = (uint8_t)((val >> 8) & 0xFF);
}
uint32_t Byte2IntL(uint8_t *buf, int pos)
{
return (uint32_t)(buf[pos] | (buf[pos + 1] << 8) | (buf[pos + 2] << 16) | (buf[pos + 3] << 24));
}
void Int2ByteL(uint8_t *buf, int pos, uint32_t val)
{
buf[pos] = (uint8_t)(val & 0xFF);
buf[pos + 1] = (uint8_t)((val >> 8) & 0xFF);
buf[pos + 2] = (uint8_t)((val >> 16) & 0xFF);
buf[pos + 3] = (uint8_t)((val >> 24) & 0xFF);
}
// MODBUS<55><53>CRC<52>
u16 MODBUS_RTU_CRC16(u8 *puchMsg, u16 usDataLen)
{
u16 crc = 0xFFFF;
u8 i;
while (usDataLen--) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
crc ^= *puchMsg++;
for(i = 0; i < 8; i++)
{
if(crc & 0x0001)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>˳<EFBFBD><CBB3>
return ((crc & 0xFF) << 8) | ((crc >> 8) & 0xFF);
}