signal_generator/User/application/src/communication_protocol.c

50 lines
2.2 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; // 帧尾
}
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);
}