From 711f6b3233c529ca1a38a9f6aabf1d0d00568b72 Mon Sep 17 00:00:00 2001 From: Zhaohe Date: Sat, 10 Dec 2022 21:08:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=B2=E5=8F=A3=E6=97=A5?= =?UTF-8?q?=E5=BF=97=EF=BC=8C=E4=BF=AE=E6=94=B9modbus=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/components/modbus/modbus.cpp | 19 +++++++++++++------ core/components/modbus/modbus.hpp | 7 +++---- core/components/uart/uart.cpp | 19 +++++++++++++++++-- core/components/uart/uart.hpp | 4 ++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/core/components/modbus/modbus.cpp b/core/components/modbus/modbus.cpp index ff6729d..7d1aac0 100644 --- a/core/components/modbus/modbus.cpp +++ b/core/components/modbus/modbus.cpp @@ -55,7 +55,7 @@ bool ModbusMaster::initializeTtyChannel(const char* ttypath, int rate) { } } -bool ModbusMaster::modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum, Modbus03Rx& rx, uint32_t overtime) { +int ModbusMaster::modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum, Modbus03Rx& rx, uint32_t overtime) { lock_guard lock(m_lock); // // @@ -74,7 +74,7 @@ bool ModbusMaster::modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum bool create_tx_suc = zmodbus_master_create_packet(txbuf, sizeof(txbuf), &sendlength, &masterdata); if (!create_tx_suc) { logger->error("modbus03-(d {},reg {}:{})::zmodbus_master_create_packet fail", deviceid, startreg, regnum); - return false; + return -1; } uartdev->flush_rx(); @@ -83,7 +83,7 @@ bool ModbusMaster::modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum ret = uartdev->send((char*)txbuf, sendlength); if (ret < sendlength) { logger->error("modbus03-(d {},reg {}:{})::send packet fail", deviceid, startreg, regnum); - return false; + return -1; } // 接收指定包长的包 // add(1)+function_code(1)+num(1)+regs(2*6)+crc(2) @@ -93,15 +93,22 @@ bool ModbusMaster::modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum ret = uartdev->receive((char*)rx.rx.data(), rxsize, overtime); if (ret != rxsize) { logger->error("modbus03-(d {},reg {}:{})::receive_packet_safe fail", deviceid, startreg, regnum); - return false; + return -1; + } + if (((uint8_t*)rx.rx.data())[1] == uint8_t(0x90)) { + // receive error code + uint8_t errocode = ((uint8_t*)rx.rx.data())[2]; + logger->error("modbus03-(d {},reg {}:{})::receive error code: {},{}", deviceid, startreg, regnum, errocode, + modbusStatusToStr(errocode)); + return errocode; } - uint16_t crc = ZGenerateCRC16CheckCode((uint8_t*)rx.rx.data(), rxsize - 2); if (crc != (rx.rx[rxsize - 2] << 8 | rx.rx[rxsize - 1])) { logger->error("modbus03-(d {},reg {}:{})::crc check fail", deviceid, startreg, regnum); return false; } - return true; + + return 0; } int ModbusMaster::modbus10(uint8_t deviceid, uint16_t startreg, uint16_t regnum, uint16_t* txreg, uint32_t overtime) { diff --git a/core/components/modbus/modbus.hpp b/core/components/modbus/modbus.hpp index d862f68..121f740 100644 --- a/core/components/modbus/modbus.hpp +++ b/core/components/modbus/modbus.hpp @@ -61,7 +61,7 @@ class ModbusMaster { * * DEMO: * Modbus03Rx rx; - * if (modbus03(1, 2, 2, rx, 1000)) { + * if (modbus03(1, 2, 2, rx, 1000) == 0) { * uint16_t reg2 = rx.getReg(2); * uint16_t reg3 = rx.getReg(3); * } @@ -71,10 +71,9 @@ class ModbusMaster { * @param regnum * @param rx * @param overtime - * @return true - * @return false + * @return int */ - bool modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum, Modbus03Rx& rx, uint32_t overtime); + int modbus03(uint8_t deviceid, uint16_t startreg, uint16_t regnum, Modbus03Rx& rx, uint32_t overtime); // write n reg /** * @brief 写入n reg diff --git a/core/components/uart/uart.cpp b/core/components/uart/uart.cpp index bf692d6..b5f0b80 100644 --- a/core/components/uart/uart.cpp +++ b/core/components/uart/uart.cpp @@ -18,7 +18,10 @@ #include #include +#include "iflytopcpp/core/components/string_util.hpp" #include "iflytopcpp/core/components/time_util.hpp" +using namespace iflytop; +using namespace iflytop::core; int uartStart(struct UartDevice *dev, unsigned char canonic); int uartSend(struct UartDevice *dev, char *data, int size); @@ -191,8 +194,20 @@ Uart::~Uart() { } int Uart::start(unsigned char canonic) { return uartStart(&this->device, canonic); } -int Uart::send(char *data, int size) { return uartSend(&this->device, data, size); } -int Uart::receive(char *data, int size_max) { return uartReceive(&this->device, data, size_max); } +int Uart::send(char *data, int size) { + if (logger->level() <= level::debug) { + logger->debug("{} send: {}", this->device.name, StringUtil().bytesToString((const uint8_t *)data, size)); + } + return uartSend(&this->device, data, size); +} +int Uart::receive(char *data, int size_max) { + int ret = uartReceive(&this->device, data, size_max); + if (logger->level() <= level::debug) { + if (ret > 0) { + logger->debug("{} receive: {}[{}]", this->device.name, StringUtil().bytesToString((const uint8_t *)data, ret)); + } + } +} int Uart::stop() { int rc = uartStop(&this->device); return rc; diff --git a/core/components/uart/uart.hpp b/core/components/uart/uart.hpp index ad3377b..290f6c6 100644 --- a/core/components/uart/uart.hpp +++ b/core/components/uart/uart.hpp @@ -13,6 +13,8 @@ #include #include +#include "iflytopcpp/core/spdlogfactory/logger.hpp" + #define UART_FAILURE -1 #define UART_SUCCESS 0 struct UartDevice { @@ -29,6 +31,8 @@ using namespace std; // ref:https://www.cnblogs.com/electron/p/3451114.html // ref:https://baike.baidu.com/item/tcflush/6869357?fr=aladdin class Uart { + ENABLE_LOGGER(Uart); + private: /* data */ UartDevice device = {0};