#ifndef _PROTO_MODBUS_H_ #define _PROTO_MODBUS_H_ #include "main.h" #define MODBUS_DEFAULT_ID (0x01) #define MODBUS_SENDBUF_LEN (512U) #define U16_DATA_L (0)//低16位 #define U16_DATA_H (1)//高16位 #define BIG_ENDIAN (0)//大端序 #define LITTLE_ENDIAN (1)//小端序 typedef struct _ModbusCommunicationSendBuf{ u8 SendBuffer[MODBUS_SENDBUF_LEN]; u16 Len; }ModbusCommunicationSendBuf_t; typedef struct _ModbusAnalysisData { u8 ID; /*ModbusID*/ u8 Func; /*功能号*/ u16 StartAddress; /*起始地址*/ u16 RegNumber; /*寄存器数量*/ u8 *wDataAddress; /*写入寄存器数据地址*/ }ModbusAnalysisData_t; typedef enum _ModbusErrorCode { ModbusErrorCode_Success = 0x00, ModbusErrorCode_IllegalFunction = 0x01, ModbusErrorCode_IllegalAddr = 0x02, ModbusErrorCode_IllegalData = 0x03, ModbusErrorCode_DeviceBusy = 0x06 }ModbusErrorCode_e; typedef struct proto_Modbus_t proto_Modbus_t; struct proto_Modbus_t { u8 ID; u16 (*DataRead)(u16); /*Modbus读数据*/ ModbusErrorCode_e (*DataWrite)(u16,u16); /*Modbus写数据*/ void (*Init)(void); /*初始化函数*/ void (*Task)(void); /*任务函数*/ void (*DataAnalysis)(u8 *,u16,void *); /*数据解析*/ }; u16 ModbusCrc16(u8 *pData, u16 Len); u16 FloatTOu16(float FloatData,unsigned char HorL); u16 u32TOu16(u32 u32Data,unsigned char HorL); u32 u8TOu32(u8 *p_u8Data,unsigned char u8Endian); u16 u8TOu16(u8 *p_u8Data,unsigned char u8Endian); void u32TOu8(u32 u32Data,u8 *pData,u8 Endian); void u16TOu8(u16 u16Data,u8 *pData,u8 Endian); u32 u32_EndianConv(u32 Data); u16 u16_EndianConv(u16 Data); void ModbusReadData(u8 Id,u16 Addr,u16 Num,void (*UsartSendBuffer)(u8 *,u16 )); void ModbusWriteMultipleData(u8 ID,u16 Addr,u16 Num,u16 *Data,void (*UsartSendBuffer)(u8 *,u16 )); void ModbusyWriteOnlData(u8 ID,u16 Addr,u16 Value,void (*UsartSendBuffer)(u8 *,u16 )); u8 ModbusAnalysis(ModbusAnalysisData_t *pModbus, u8 *pData, u16 len); #endif