39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
#include "data_packet.h"
|
|
|
|
// CRC16-MODBUS
|
|
uint16_t Calculate_CRC16(uint8_t *data, uint16_t len) {
|
|
uint16_t crc = 0xFFFF;
|
|
for (uint16_t i = 0; i < len; i++) {
|
|
crc ^= data[i];
|
|
for (uint8_t j = 0; j < 8; j++) {
|
|
if (crc & 0x0001) {
|
|
crc = (crc >> 1) ^ 0xA001;
|
|
} else {
|
|
crc = crc >> 1;
|
|
}
|
|
}
|
|
}
|
|
return crc;
|
|
}
|
|
|
|
void PackData(DataPacket_t *packet, int32_t adc1, int32_t adc2, int32_t adc3)
|
|
{
|
|
// packet->start_byte = PACKET_START_BYTE; // Incorrect assignment
|
|
uint32_t start = PACKET_START_BYTE;
|
|
packet->start_byte[0] = (start >> 24) & 0xFF; // A5
|
|
packet->start_byte[1] = (start >> 16) & 0xFF; // A5
|
|
packet->start_byte[2] = (start >> 8) & 0xFF; // 5A
|
|
packet->start_byte[3] = (start) & 0xFF; // 5A
|
|
|
|
// MCU 原生字节序 (小端)
|
|
packet->adc_data1 = adc1;
|
|
packet->adc_data2 = adc2;
|
|
packet->adc_data3 = adc3;
|
|
|
|
// 计算校验和 (只计算 ADC 数据部分)
|
|
// uint16_t checksum = Calculate_CRC16((uint8_t*)&packet->adc_data1, sizeof(uint32_t) * 3);
|
|
// packet->checksum = checksum; // 校验和也用小端
|
|
|
|
// packet->end_byte = PACKET_END_BYTE;
|
|
}
|