Browse Source

添加串口日志,修改modbus函数接口

master
zhaohe 3 years ago
parent
commit
711f6b3233
  1. 19
      core/components/modbus/modbus.cpp
  2. 7
      core/components/modbus/modbus.hpp
  3. 19
      core/components/uart/uart.cpp
  4. 4
      core/components/uart/uart.hpp

19
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<recursive_mutex> lock(m_lock); lock_guard<recursive_mutex> 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); bool create_tx_suc = zmodbus_master_create_packet(txbuf, sizeof(txbuf), &sendlength, &masterdata);
if (!create_tx_suc) { if (!create_tx_suc) {
logger->error("modbus03-(d {},reg {}:{})::zmodbus_master_create_packet fail", deviceid, startreg, regnum); logger->error("modbus03-(d {},reg {}:{})::zmodbus_master_create_packet fail", deviceid, startreg, regnum);
return false;
return -1;
} }
uartdev->flush_rx(); 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); ret = uartdev->send((char*)txbuf, sendlength);
if (ret < sendlength) { if (ret < sendlength) {
logger->error("modbus03-(d {},reg {}:{})::send packet fail", deviceid, startreg, regnum); 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) // 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); ret = uartdev->receive((char*)rx.rx.data(), rxsize, overtime);
if (ret != rxsize) { if (ret != rxsize) {
logger->error("modbus03-(d {},reg {}:{})::receive_packet_safe fail", deviceid, startreg, regnum); 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); uint16_t crc = ZGenerateCRC16CheckCode((uint8_t*)rx.rx.data(), rxsize - 2);
if (crc != (rx.rx[rxsize - 2] << 8 | rx.rx[rxsize - 1])) { if (crc != (rx.rx[rxsize - 2] << 8 | rx.rx[rxsize - 1])) {
logger->error("modbus03-(d {},reg {}:{})::crc check fail", deviceid, startreg, regnum); logger->error("modbus03-(d {},reg {}:{})::crc check fail", deviceid, startreg, regnum);
return false; return false;
} }
return true;
return 0;
} }
int ModbusMaster::modbus10(uint8_t deviceid, uint16_t startreg, uint16_t regnum, uint16_t* txreg, uint32_t overtime) { int ModbusMaster::modbus10(uint8_t deviceid, uint16_t startreg, uint16_t regnum, uint16_t* txreg, uint32_t overtime) {

7
core/components/modbus/modbus.hpp

@ -61,7 +61,7 @@ class ModbusMaster {
* *
* DEMO: * DEMO:
* Modbus03Rx rx; * 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 reg2 = rx.getReg(2);
* uint16_t reg3 = rx.getReg(3); * uint16_t reg3 = rx.getReg(3);
* } * }
@ -71,10 +71,9 @@ class ModbusMaster {
* @param regnum * @param regnum
* @param rx * @param rx
* @param overtime * @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 // write n reg
/** /**
* @brief n reg * @brief n reg

19
core/components/uart/uart.cpp

@ -18,7 +18,10 @@
#include <string.h> #include <string.h>
#include <termios.h> #include <termios.h>
#include "iflytopcpp/core/components/string_util.hpp"
#include "iflytopcpp/core/components/time_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 uartStart(struct UartDevice *dev, unsigned char canonic);
int uartSend(struct UartDevice *dev, char *data, int size); 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::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 Uart::stop() {
int rc = uartStop(&this->device); int rc = uartStop(&this->device);
return rc; return rc;

4
core/components/uart/uart.hpp

@ -13,6 +13,8 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "iflytopcpp/core/spdlogfactory/logger.hpp"
#define UART_FAILURE -1 #define UART_FAILURE -1
#define UART_SUCCESS 0 #define UART_SUCCESS 0
struct UartDevice { struct UartDevice {
@ -29,6 +31,8 @@ using namespace std;
// ref:https://www.cnblogs.com/electron/p/3451114.html // ref:https://www.cnblogs.com/electron/p/3451114.html
// ref:https://baike.baidu.com/item/tcflush/6869357?fr=aladdin // ref:https://baike.baidu.com/item/tcflush/6869357?fr=aladdin
class Uart { class Uart {
ENABLE_LOGGER(Uart);
private: private:
/* data */ /* data */
UartDevice device = {0}; UartDevice device = {0};

Loading…
Cancel
Save