diff --git a/modbus/modbus_block_host.cpp b/modbus/modbus_block_host.cpp index c3712c6..9c52a34 100644 --- a/modbus/modbus_block_host.cpp +++ b/modbus/modbus_block_host.cpp @@ -58,8 +58,8 @@ bool ModbusBlockHost::uartrx(uint8_t *buff, size_t len, int overtimems) { if (m_dump) { if (status == HAL_OK) { printf("uart_rx:"); - for (size_t i = 0; i < len; i++) { - printf("%02x ", buff[i]); + for (size_t byteoff = 0; byteoff < len; byteoff++) { + printf("%02x ", buff[byteoff]); } printf("\n"); } @@ -117,7 +117,7 @@ bool ModbusBlockHost::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *r // return str; // } -bool ModbusBlockHost::readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int regNum, int overtimems) { +bool ModbusBlockHost::readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, int regNum,uint16_t *regVal, int overtimems) { zlock_guard lck(m_modbus_lock); txbuff[0] = slaveAddr; @@ -201,3 +201,31 @@ bool ModbusBlockHost::writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t r } return false; } + +bool ModbusBlockHost::writeReg10Muti(uint8_t slaveAddr, uint16_t regAddr,int regNum, uint16_t *regVal, int overtimems) { + zlock_guard lck(m_modbus_lock); + txbuff[0] = slaveAddr; + txbuff[1] = 0x10; + txbuff[2] = regAddr >> 8; + txbuff[3] = regAddr & 0xff; + txbuff[4] = 0x00; + txbuff[5] = regNum; + txbuff[6] = regNum * 2; + for (int i = 0; i < regNum; i++) { + txbuff[7 + i * 2] = regVal[i] >> 8; + txbuff[7 + i * 2 + 1] = regVal[i] & 0xff; + } + modbus_pack_crc_to_packet(txbuff, 7 + regNum * 2 + 2); + + cleanRxBuff(); + + uarttx(txbuff, 7 + regNum * 2 + 2); + + bool status; + status = uartrx(rxbuff, 8, overtimems); + + if (status && modbus_checkcrc16(rxbuff, 8)) { + return true; + } + return false; +} diff --git a/modbus/modbus_block_host.hpp b/modbus/modbus_block_host.hpp index 7d394f2..5be1ff8 100644 --- a/modbus/modbus_block_host.hpp +++ b/modbus/modbus_block_host.hpp @@ -12,7 +12,7 @@ class ModbusBlockHost { zmutex m_modbus_lock = {"m_modbus_lock"}; bool m_dump = false; - Pin_t rePin = PinNull; + Pin_t rePin = PinNull; ZGPIO txEnGpio; @@ -23,10 +23,12 @@ class ModbusBlockHost { void initialize(UART_HandleTypeDef *huart, Pin_t rePin = PinNull); void enableDump(bool enable); - bool readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int overtimems); - bool readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int regNum, int overtimems); bool writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems); + + bool readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t *regVal, int overtimems); + bool readReg03Muti(uint8_t slaveAddr, uint16_t regAddr, int regNum, uint16_t *regVal, int overtimems); bool writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal, int overtimems); + bool writeReg10Muti(uint8_t slaveAddr, uint16_t regAddr, int regNum, uint16_t *regVal, int overtimems); private: void cleanRxBuff();