61 lines
2.6 KiB
C
61 lines
2.6 KiB
C
#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);
|
||
}
|
||
|
||
|