From 51726ddfa3e6b9a6fae059e14954cd3619ebdfca Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 22 Nov 2024 14:31:45 +0800 Subject: [PATCH 1/2] =?UTF-8?q?modbus=5Fblock=5Fhost=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20re=E5=BC=95=E8=84=9A=E6=8E=A7=E5=88=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modbus/modbus_block_host.cpp | 10 ++++++---- modbus/modbus_block_host.hpp | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/modbus/modbus_block_host.cpp b/modbus/modbus_block_host.cpp index 8eb0aab..c3712c6 100644 --- a/modbus/modbus_block_host.cpp +++ b/modbus/modbus_block_host.cpp @@ -6,9 +6,10 @@ using namespace iflytop; ModbusBlockHost::ModbusBlockHost() {} ModbusBlockHost::~ModbusBlockHost() {} - -void ModbusBlockHost::initialize(UART_HandleTypeDef *huart) { +void ModbusBlockHost::initialize(UART_HandleTypeDef *huart, Pin_t rePin) { this->huart = huart; + this->rePin = rePin; + txEnGpio.initAsOutput(rePin, kxs_gpio_pulldown, false, false); m_modbus_lock.init(); } void ModbusBlockHost::enableDump(bool enable) { m_dump = enable; } @@ -31,13 +32,14 @@ void ModbusBlockHost::uarttx(uint8_t *buff, size_t len) { } // HAL_UART_Transmit(huart, buff, len, 1000); HAL_UART_DMAStop(huart); + if (rePin != PinNull) txEnGpio.setState(true); HAL_StatusTypeDef ret = HAL_UART_Transmit_DMA(huart, buff, len); ZASSERT(ret == HAL_OK); - // 等待DMA传输完成 while (true) { if (HAL_UART_GetState(huart) == HAL_UART_STATE_READY) break; } + if (rePin != PinNull) txEnGpio.setState(false); return; } bool ModbusBlockHost::uartrx(uint8_t *buff, size_t len, int overtimems) { @@ -182,7 +184,7 @@ bool ModbusBlockHost::writeReg10(uint8_t slaveAddr, uint16_t regAddr, uint16_t r txbuff[3] = regAddr & 0xff; txbuff[4] = 0x00; txbuff[5] = 0x01; - txbuff[6] = 0x02; // 字节数 + txbuff[6] = 0x02; // txbuff[7] = regVal >> 8; txbuff[8] = regVal & 0xff; modbus_pack_crc_to_packet(txbuff, 9 + 2); diff --git a/modbus/modbus_block_host.hpp b/modbus/modbus_block_host.hpp index fbf3a0a..7d394f2 100644 --- a/modbus/modbus_block_host.hpp +++ b/modbus/modbus_block_host.hpp @@ -12,12 +12,15 @@ class ModbusBlockHost { zmutex m_modbus_lock = {"m_modbus_lock"}; bool m_dump = false; + Pin_t rePin = PinNull; + + ZGPIO txEnGpio; public: ModbusBlockHost(); ~ModbusBlockHost(); - void initialize(UART_HandleTypeDef *huart); + 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); From bf1d21018a1b321b04d3e3b894304327e106bce9 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 22 Nov 2024 21:01:00 +0800 Subject: [PATCH 2/2] update --- modbus/modbus_block_host.cpp | 34 +++++++++++++++++++++++++++++++--- modbus/modbus_block_host.hpp | 8 +++++--- 2 files changed, 36 insertions(+), 6 deletions(-) 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();