#ifndef __MODBUS_RTU_MASTER_H #define __MODBUS_RTU_MASTER_H #include "apps_gather.h" #include "modbus_rtu.h" #define TX_BUFF_MAX 128 #define TX_DATA_MAX 100 #define RX_BUFF_MAX 128 #define TX_NONE 0x00 //没有需要发送的数据 #define TX_WAITING 0x01 //数据准备完成,等待发送 #define TX_OK 0x02 //发送完成 #define RX_NONE 0x00 //没有接收到数据 #define RX_WAITING 0x01 //等待接收 #define RX_OK 0x02 //接收完成 typedef enum { RX_ERROR_NONE = 0, //数据接收未出现错误 RX_ERROR_TIMEOUT, //接收数据超时 RX_ERROR_OVERFLOW, //接收到的数据超出缓存区 RX_ERROR_WRONG_ID, //接收到的设备ID与目标ID不符 RX_ERROR_WRONG_LENGTH, //数据长度不符 RX_ERROR_WRONG_CMD //命令无效 }ERROR_NESSAGE_RX; typedef enum { TX_ERROR_NONE = 0, //数据发送未出现错误 TX_ERROR_WRONG_CMD, //命令字错误 TX_ERROR_COIL_NUM, //写多个线圈时,线圈数量或字节数错误 TX_ERROR_HOLDREG_NUM //写保持寄存器时,寄存器数量或字节数错误 }ERROR_NESSAGE_TX; typedef struct { uint8_t target_id; //目标ID,从设备识别号、地址 uint8_t command_code; //命令字 uint16_t start_address; //起始地址 uint16_t register_num; //线圈、寄存器数量 uint16_t crc16; //MODBUS_CRC16校验码 uint8_t byte_num; //需要写入的线圈、保持寄存器字节数 uint8_t data_tx_value8[TX_DATA_MAX]; //需要写入的数值,8位 uint16_t data_tx_value16[TX_DATA_MAX]; //需要写入的数值,16位 uint8_t data_tx[TX_BUFF_MAX]; //存放完整的发送数据报 uint8_t data_rx[RX_BUFF_MAX]; //存放完整的接收数据报 uint8_t data_tx_len; //发送的数据报长度 uint8_t data_rx_len; //接收到的数据报长度 ERROR_NESSAGE_RX rx_error_message; //接收过程中的错误信息 ERROR_NESSAGE_TX tx_error_message; //发送过程中的错误信息 uint16_t timeout; //超时、等待时间 uint8_t rx_flag; //接收标志位 uint8_t tx_flag; //发送标志位 char result_display[100]; //在显示屏上显示读取到的结果 }MODBUS_MASTER; extern MODBUS_MASTER mod_master; void modbus_rtu_master_init(void); void modbus_rtu_master_load(void); void modbus_rtu_master_send(void); void modbus_rtu_master_analysis(void); void modbus_rtu_master_data_process(void); #endif