STM_ATEM/User/data_packet.c
2026-01-25 17:16:17 +08:00

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;
}