#include "communication_protocol.h" #include "user_lib.h" #include "ad7124.h" extern float current_buff[2]; extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX]; /** * @brief 处理通信异常 * * 当通信发生异常时,此函数将构造一个包含错误信息的TCP数据包,并填充相应的数据。 * * @param tx_data 发送的数据指针 * @param rx_data 接收的数据指针 * @param error_code 通信错误代码 */ void communication_exception(uint8_t *tx_data, const uint8_t *const rx_data, communication_error_e error_code) { uint8_t tx_data_len = COM_ERROR_CODE_SIZE; tx_data[0] = FRAME_HEAD; // 帧头 tx_data[1] = error_code; // 状态 tx_data[2] = rx_data[2]; // 设备号 tx_data[3] = rx_data[3]; // 命令号 tx_data[4] = 0x00; // 数据长度 tx_data[5] = xor_compute(tx_data + 1, tx_data_len - 3); // 异或校验 tx_data[6] = FRAME_TAIL; // 帧尾 } /** * @brief 获取AI数据并封装成通信帧 * * 该函数从指定的AI通道获取模拟数据,并将其封装成一个通信帧。 * * @param ai_data 指向communication_ai_t结构体的指针,包含AI通道信息 * @param tx_data 指向uint8_t数组的指针,用于存储生成的通信帧 * @param rx_data 指向const uint8_t数组的指针,包含接收到的命令数据 */ void communication_get_ai(communication_ai_t *ai_data, uint8_t *tx_data, const uint8_t *const rx_data) { float32_u analog_data; uint8_t tx_data_len = COM_AI_DATA_SIZE; analog_data.f = S2B_FLOAT32(ad7124_analog[ai_data->channel].current); tx_data[0] = FRAME_HEAD; // 帧头 tx_data[1] = COM_OK; // 状态 tx_data[2] = rx_data[2]; // 设备号 tx_data[3] = rx_data[3]; // 命令号 tx_data[4] = 4; // 数据长度 tx_data[5] = analog_data.c; // 数据 tx_data[6] = analog_data.c >> 8; // 数据 tx_data[7] = analog_data.c >> 16; // 数据 tx_data[8] = analog_data.c >> 24; // 数据 tx_data[9] = xor_compute(tx_data + 1, tx_data_len - 3); // 异或校验 tx_data[10] = FRAME_TAIL; // 帧尾 } void communication_set_ao(communication_ao_t *ao_data) { current_buff[ao_data->channel] = B2S_FLOAT32(ao_data->data.f); }