|
|
@ -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); |
|
|
|
//
|
|
|
|
//
|
|
|
@ -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) { |
|
|
|