#ifndef _COMMUNICATION_PROTOCOL_H_ #define _COMMUNICATION_PROTOCOL_H_ #include "user_lib.h" #define COM_ERROR_CODE_SIZE 7 // 通信错误返回帧长度 #define COM_AI_DATA_SIZE 11 // 模拟量数据返回帧长度 #define COM_ENCODER_DATA_SIZE 12 // 模拟量数据返回帧长度 #define FRAME_HEAD 0xAA // 帧头 #define FRAME_TAIL 0x3C // 帧尾 #define DEVICE_NUM 0x00 // 设备号 typedef enum { READ_ANALOG_CMD = 0x00, // 读模拟量命令 WRITE_ANALOG_CMD, // 写模拟量命令 READ_DIGITAL_CMD, // 读数字量命令 WRITE_DIGITAL_CMD, // 写数字量命令 SEND_STATE_CMD, // 主动上发状态命令 READ_ENCODER_CMD, // 读编码器命令 } communication_cmd_e; // #define READ_ANALOG_CMD 0x00 // 读模拟量命令 // #define WRITE_ANALOG_CMD 0x01 // 写模拟量命令 // #define READ_DIGITAL_CMD 0x02 // 读数字量命令 // #define WRITE_DIGITAL_CMD 0x03 // 写数字量命令 // #define SEND_STATE_CMD 0x04 // 主动上发状态命令 // #define READ_ENCODER_CMD 0x05 // 读编码器命令 typedef enum { COM_OK = 0, FRAMING_ERROR, CHECK_ERROR, COMMAND_ERROR, DEVICE_ERROR, } communication_error_e; #pragma pack(1) typedef struct { uint8_t start_addr; uint8_t num; uint8_t data[16]; } communication_do_t; typedef struct { uint8_t start_addr; uint8_t num; } communication_di_t; typedef struct { uint8_t channel; float32_u data; } communication_ao_t; typedef struct { uint8_t channel; } communication_ai_t; typedef struct { uint8_t channel; } comnmunication_encoder_t; typedef union { uint8_t data[50]; communication_do_t do_data; communication_di_t di_data; communication_ao_t ao_data; communication_ai_t ai_data; comnmunication_encoder_t encoder_data; } communication_data_u; #pragma pack() void communication_exception(uint8_t *tx_data, const uint8_t *const rx_data, communication_error_e error_code); void communication_get_ai(communication_ai_t *ai_data, uint8_t *tx_data, const uint8_t *const rx_data); void communication_set_ao(communication_ao_t *ao_data); void communication_get_encoder(comnmunication_encoder_t *encoder_data, uint8_t *tx_data, const uint8_t *const rx_data); void communication_reset_hart(void); #endif