概述
编写一段在 MODBUS 透传设备上的 Master 代码。透传设备上是通过串口转485模块跟485设备通信。透传设备上主要是按照 MODBUS Master的角色,发起 Request 并等待485设备的Response。其实,就是简单的调用了串口写后,再调用串口读超时。
参考文档及代码
MODBUS Application Protocol 1 1 bhttps://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdfAbout - Embedded Experts (embedded-experts.at)https://www.embedded-experts.at/en/freemodbus/about/luoyun1989/freemodbushttps://gitee.com/luoyun1989/freemodbus.gitluoyun1989/STM32_HAL_FREEMODBUS_RTUhttps://gitee.com/luoyun1989/STM32_HAL_FREEMODBUS_RTU.gitluoyun1989/FreeModbus_Slave-Master-RTT-STM32https://gitee.com/luoyun1989/FreeModbus_Slave-Master-RTT-STM32.gitluoyun1989/libmodbushttps://gitee.com/luoyun1989/libmodbus.git
代码编写
根据自己的串口驱动,实现write_ex, read_ex, read_ex中设置了500ms超时。(Master等待Slaver 回复的时间,通常设置为300~500ms,根据不同设备也可能是几秒)。
int32_t write_ex(uint8_t *buf, uint32_t buf_len) { uint32_t write_len = 0; int32_t retVal = rs232_write(s_pst232port, buf, buf_len, &write_len); return retVal; } int32_t read_ex(uint8_t *buf, uint32_t buf_len) { uint32_t read_len = 0; int32_t retVal = 0; if ((buf == NULL) || (buf_len < MAX_BUF_LEN)) { return -1; } retVal = rs232_read_timeout(s_pst232port, buf, buf_len, &read_len, 500); if (retVal == 0) { return read_len; } return -1; } |
#define MB_ADU_LEN 256 #define MB_PDU_LEN (MB_ADU_LEN - 3) #define MB_ADU_REQ_LEN_MIN 8 #define MB_ADU_RSP_LEN_MIN 5 #define MB_ADU_ADDR_INDEX 0 #define MB_ADU_FUNC_INDEX (MB_ADU_ADDR_INDEX + 1) #define MB_ADU_START_ADDR_INDEX (MB_ADU_FUNC_INDEX + 1) #define MB_ADU_QUANTITY_INDEX (MB_ADU_START_ADDR_INDEX + 2) #define MB_ADU_COUNT_INDEX (MB_ADU_FUNC_INDEX + 1) #define MB_ADU_INVALID_FUNC 0 #define MB_ADU_RSP_FUNC_EXCEPTION 0x80 #define MB_COILS_QUANTITY_MAX 2000 //0x7D0 #define MB_DISCRETE_INPUTS_QUANTITY_MAX 2000 //0x7D0 #define MB_INPUT_REGISTER_QUANTITY_MAX 125 //0x7D #define MAX_DATA_LEN 48 typedef enum MB_function_code { //常用的 Function Code,其它暂不实现 MB_READ_COILS = 01, MB_READ_DISCRETE_INPUTS, MB_READ_HOLDING_REGISTERS,
|