signal_generator/User/application/src/communication_protocol.c

61 lines
2.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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