- 在数据包结构中新增gps_altitude字段以支持海拔数据存储 - 更新PackData和PackCorrectedData系列函数,增加altitude参数 - 移除timestamp字段以精简数据包结构,提高传输效率 - 优化GPS数据处理逻辑,取消GPS有效性检查,直接使用原始GPS数据 - 将调试输出和监控保存间隔统一调整为30秒,降低系统负载 - 将数据存储文件最大大小从20MB提升至100MB,支持更长时间数据采集 - 将GPS数据超时时间从2秒延长至10秒,提高在弱信号环境下的稳定性 🔧 chore(spi): 调整SPI配置以优化通信稳定性 - 将所有SPI接口的时钟相位从SPI_PHASE_1EDGE调整为SPI_PHASE_2EDGE - 将SPI1的波特率预分频器从4调整为8,降低通信速率以提高稳定性 - 更新STM32CubeMX配置文件(.ioc)以反映SPI配置变更 📝 docs(script): 新增高性能数据分析工具脚本 - 创建atem_parse.py脚本,提供数据解析和可视化功能 - 支持V1/V2数据格式解析,V2版本包含GPS经纬度和海拔数据 - 实现串口实时数据接收和GPS动态模拟输出功能 - 提供波形图、轨迹图和海拔曲线等多标签可视化界面 - 包含数据表格展示和CSV导出功能,支持高性能大数据处理
125 lines
3.3 KiB
C
125 lines
3.3 KiB
C
#include "data_packet.h"
|
||
#include "stddef.h"
|
||
#include "stm32f4xx_hal.h"
|
||
|
||
// CRC16-MODBUS算法实现
|
||
uint16_t Calculate_CRC16(const 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,
|
||
uint32_t gps_time, float latitude, float longitude, float altitude)
|
||
{
|
||
if (packet == NULL) return;
|
||
|
||
// 设置包头
|
||
packet->start_byte = PACKET_START_BYTE;
|
||
|
||
// 设置时间戳
|
||
// packet->timestamp = HAL_GetTick();
|
||
|
||
// 设置ADC数据
|
||
packet->adc_data1 = adc1;
|
||
packet->adc_data2 = adc2;
|
||
packet->adc_data3 = adc3;
|
||
|
||
// 设置GPS数据
|
||
packet->gps_time = gps_time;
|
||
packet->gps_latitude = latitude;
|
||
packet->gps_longitude = longitude;
|
||
packet->gps_altitude = altitude;
|
||
}
|
||
|
||
uint8_t ValidatePacket(const DataPacket_t *packet)
|
||
{
|
||
if (packet == NULL) return 0;
|
||
|
||
// 检查包头
|
||
if (packet->start_byte != PACKET_START_BYTE) return 0;
|
||
|
||
// 精简版数据包无校验和,仅检查包头
|
||
return 1; // 包头正确,认为有效
|
||
}
|
||
|
||
uint8_t ValidateCorrectedPacket(const CorrectedDataPacket_t *packet)
|
||
{
|
||
if (packet == NULL) return 0;
|
||
|
||
// 检查包头
|
||
if (packet->start_byte != PACKET_START_BYTE) return 0;
|
||
|
||
// 精简版数据包无校验和,仅检查包头
|
||
return 1; // 包头正确,认为有效
|
||
}
|
||
|
||
void PackCorrectedData(CorrectedDataPacket_t *packet, float x, float y, float z,
|
||
uint32_t gps_time, float latitude, float longitude, float altitude)
|
||
{
|
||
if (packet == NULL) return;
|
||
|
||
// 设置包头
|
||
packet->start_byte = PACKET_START_BYTE;
|
||
|
||
// 设置时间戳
|
||
// packet->timestamp = HAL_GetTick();
|
||
|
||
// 设置校正后数据
|
||
packet->corrected_x = x;
|
||
packet->corrected_y = y;
|
||
packet->corrected_z = z;
|
||
|
||
// 设置GPS数据
|
||
packet->gps_time = gps_time;
|
||
packet->gps_latitude = latitude;
|
||
packet->gps_longitude = longitude;
|
||
packet->gps_altitude = altitude;
|
||
}
|
||
|
||
void PackCorrectedDataWithGPS(CorrectedDataPacketWithGPS_t *packet, float x, float y, float z,
|
||
uint32_t gps_time, float latitude, float longitude, float altitude)
|
||
{
|
||
if (packet == NULL) return;
|
||
|
||
// 设置包头
|
||
packet->start_byte = PACKET_START_BYTE;
|
||
|
||
// 设置时间戳
|
||
// packet->timestamp = HAL_GetTick();
|
||
|
||
// 设置校正后数据
|
||
packet->corrected_x = x;
|
||
packet->corrected_y = y;
|
||
packet->corrected_z = z;
|
||
|
||
// 设置GPS数据
|
||
packet->gps_time = gps_time;
|
||
packet->gps_latitude = latitude;
|
||
packet->gps_longitude = longitude;
|
||
packet->gps_altitude = altitude;
|
||
}
|
||
|
||
uint8_t ValidateCorrectedPacketWithGPS(const CorrectedDataPacketWithGPS_t *packet)
|
||
{
|
||
if (packet == NULL) return 0;
|
||
|
||
// 检查包头
|
||
if (packet->start_byte != PACKET_START_BYTE) return 0;
|
||
|
||
// 精简版数据包无校验和,仅检查包头
|
||
// 可以添加简单的数据合理性检查
|
||
// 例如:检查GPS坐标是否在有效范围内等
|
||
|
||
return 1; // 包头正确,认为有效
|
||
}
|