diff --git a/src/ModbusRTUClient.cpp b/src/ModbusRTUClient.cpp index 8249590..b9c25bb 100644 --- a/src/ModbusRTUClient.cpp +++ b/src/ModbusRTUClient.cpp @@ -34,9 +34,9 @@ ModbusRTUClientClass::~ModbusRTUClientClass() { } -int ModbusRTUClientClass::begin(unsigned long baudrate, uint16_t config) +int ModbusRTUClientClass::begin(unsigned long baudrate, uint16_t config, RS485Class& rs485) { - modbus_t* mb = modbus_new_rtu(baudrate, config); + modbus_t* mb = modbus_new_rtu(baudrate, config, &rs485); if (!ModbusClient::begin(mb, 0x00)) { return 0; @@ -47,4 +47,9 @@ int ModbusRTUClientClass::begin(unsigned long baudrate, uint16_t config) return 1; } +int ModbusRTUClientClass::begin(unsigned long baudrate, RS485Class& rs485) +{ + return begin(baudrate, SERIAL_8N1, rs485); +} + ModbusRTUClientClass ModbusRTUClient; diff --git a/src/ModbusRTUClient.h b/src/ModbusRTUClient.h index 2dc96c9..9264aeb 100644 --- a/src/ModbusRTUClient.h +++ b/src/ModbusRTUClient.h @@ -22,6 +22,8 @@ #include "ModbusClient.h" +#include + class ModbusRTUClientClass : public ModbusClient { public: ModbusRTUClientClass(); @@ -35,7 +37,8 @@ class ModbusRTUClientClass : public ModbusClient { * * Return 1 on success, 0 on failure */ - int begin(unsigned long baudrate, uint16_t config = SERIAL_8N1); + int begin(unsigned long baudrate, uint16_t config = SERIAL_8N1, RS485Class& rs485 = RS485); + int begin(unsigned long baudrate, RS485Class& rs485); }; extern ModbusRTUClientClass ModbusRTUClient; diff --git a/src/ModbusRTUServer.cpp b/src/ModbusRTUServer.cpp index 7c4dfb9..03bd93d 100644 --- a/src/ModbusRTUServer.cpp +++ b/src/ModbusRTUServer.cpp @@ -34,9 +34,9 @@ ModbusRTUServerClass::~ModbusRTUServerClass() { } -int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config) +int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config, RS485Class& rs485) { - modbus_t* mb = modbus_new_rtu(baudrate, config); + modbus_t* mb = modbus_new_rtu(baudrate, config, &rs485); if (!ModbusServer::begin(mb, id)) { return 0; @@ -47,6 +47,11 @@ int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config) return 1; } +int ModbusRTUServerClass::begin(int id, unsigned long baudrate, RS485Class& rs485) +{ + return begin(id, baudrate, SERIAL_8N1, RS485); +} + void ModbusRTUServerClass::poll() { uint8_t request[MODBUS_RTU_MAX_ADU_LENGTH]; diff --git a/src/ModbusRTUServer.h b/src/ModbusRTUServer.h index 82cd885..04176b6 100644 --- a/src/ModbusRTUServer.h +++ b/src/ModbusRTUServer.h @@ -22,6 +22,8 @@ #include "ModbusServer.h" +#include + class ModbusRTUServerClass : public ModbusServer { public: ModbusRTUServerClass(); @@ -36,7 +38,8 @@ class ModbusRTUServerClass : public ModbusServer { * * Return 1 on success, 0 on failure */ - int begin(int id, unsigned long baudrate, uint16_t config = SERIAL_8N1); + int begin(int id, unsigned long baudrate, uint16_t config = SERIAL_8N1, RS485Class& rs485 = RS485); + int begin(int id, unsigned long baudrate, RS485Class& rs485); /** * Poll interface for requests diff --git a/src/libmodbus/modbus-rtu-private.h b/src/libmodbus/modbus-rtu-private.h index 736cbce..5cd6a8b 100644 --- a/src/libmodbus/modbus-rtu-private.h +++ b/src/libmodbus/modbus-rtu-private.h @@ -17,7 +17,7 @@ #if defined(_WIN32) #include #elif defined(ARDUINO) -// nothing extra needed +#include #else #include #endif @@ -49,6 +49,7 @@ typedef struct _modbus_rtu { #if defined(ARDUINO) unsigned long baud; uint16_t config; + RS485Class* rs485; #else /* Device: "/dev/ttyS0", "/dev/ttyUSB0" or "/dev/tty.USA19*" on Mac OS X. */ char *device; diff --git a/src/libmodbus/modbus-rtu.cpp b/src/libmodbus/modbus-rtu.cpp index d24b520..29f8e50 100644 --- a/src/libmodbus/modbus-rtu.cpp +++ b/src/libmodbus/modbus-rtu.cpp @@ -16,7 +16,6 @@ #include #ifdef ARDUINO -#include #ifndef DEBUG #define printf(...) {} @@ -323,15 +322,17 @@ static ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_lengt DWORD n_bytes = 0; return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? (ssize_t)n_bytes : -1; #elif defined(ARDUINO) + modbus_rtu_t *ctx_rtu = (modbus_rtu_t *)ctx->backend_data; + RS485Class *rs485 = ctx_rtu->rs485; (void)ctx; ssize_t size; - RS485.noReceive(); - RS485.beginTransmission(); - size = RS485.write(req, req_length); - RS485.endTransmission(); - RS485.receive(); + rs485->noReceive(); + rs485->beginTransmission(); + size = rs485->write(req, req_length); + rs485->endTransmission(); + rs485->receive(); return size; #else @@ -394,9 +395,11 @@ static ssize_t _modbus_rtu_recv(modbus_t *ctx, uint8_t *rsp, int rsp_length) #if defined(_WIN32) return win32_ser_read(&((modbus_rtu_t *)ctx->backend_data)->w_ser, rsp, rsp_length); #elif defined(ARDUINO) + modbus_rtu_t *ctx_rtu = (modbus_rtu_t *)ctx->backend_data; + RS485Class *rs485 = ctx_rtu->rs485; (void)ctx; - return RS485.readBytes(rsp, rsp_length); + return rs485->readBytes(rsp, rsp_length); #else return read(ctx->s, rsp, rsp_length); #endif @@ -479,6 +482,7 @@ static int _modbus_rtu_connect(modbus_t *ctx) #endif #ifdef ARDUINO modbus_rtu_t *ctx_rtu = (modbus_rtu_t*)ctx->backend_data; + RS485Class *rs485 = ctx_rtu->rs485; #else modbus_rtu_t *ctx_rtu = ctx->backend_data; @@ -654,8 +658,8 @@ static int _modbus_rtu_connect(modbus_t *ctx) return -1; } #elif defined(ARDUINO) - RS485.begin(ctx_rtu->baud, ctx_rtu->config); - RS485.receive(); + rs485->begin(ctx_rtu->baud, ctx_rtu->config); + rs485->receive(); #else /* The O_NOCTTY flag tells UNIX that this program doesn't want to be the "controlling terminal" for that port. If you @@ -1192,6 +1196,7 @@ static void _modbus_rtu_close(modbus_t *ctx) /* Restore line settings and close file descriptor in RTU mode */ #ifdef ARDUINO modbus_rtu_t *ctx_rtu = (modbus_rtu_t*)ctx->backend_data; + RS485Class *rs485 = ctx_rtu->rs485; #else modbus_rtu_t *ctx_rtu = ctx->backend_data; #endif @@ -1210,8 +1215,8 @@ static void _modbus_rtu_close(modbus_t *ctx) #elif defined(ARDUINO) (void)ctx_rtu; - RS485.noReceive(); - RS485.end(); + rs485->noReceive(); + rs485->end(); #else if (ctx->s != -1) { tcsetattr(ctx->s, TCSANOW, &ctx_rtu->old_tios); @@ -1228,10 +1233,12 @@ static int _modbus_rtu_flush(modbus_t *ctx) ctx_rtu->w_ser.n_bytes = 0; return (PurgeComm(ctx_rtu->w_ser.fd, PURGE_RXCLEAR) == FALSE); #elif defined(ARDUINO) + modbus_rtu_t *ctx_rtu = (modbus_rtu_t *)ctx->backend_data; + RS485Class *rs485 = ctx_rtu->rs485; (void)ctx; - while (RS485.available()) { - RS485.read(); + while (rs485->available()) { + rs485->read(); } return 0; @@ -1256,6 +1263,8 @@ static int _modbus_rtu_select(modbus_t *ctx, fd_set *rset, return -1; } #elif defined(ARDUINO) + modbus_rtu_t *ctx_rtu = (modbus_rtu_t *)ctx->backend_data; + RS485Class *rs485 = ctx_rtu->rs485; (void)ctx; (void)rset; @@ -1263,7 +1272,7 @@ static int _modbus_rtu_select(modbus_t *ctx, fd_set *rset, unsigned long start = millis(); do { - s_rc = RS485.available(); + s_rc = rs485->available(); if (s_rc >= length_to_read) { break; @@ -1330,7 +1339,7 @@ const modbus_backend_t _modbus_rtu_backend = { }; #ifdef ARDUINO -modbus_t* modbus_new_rtu(unsigned long baud, uint16_t config) +modbus_t* modbus_new_rtu(unsigned long baud, uint16_t config, RS485Class* rs485) #else modbus_t* modbus_new_rtu(const char *device, int baud, char parity, int data_bit, @@ -1364,6 +1373,7 @@ modbus_t* modbus_new_rtu(const char *device, #ifdef ARDUINO ctx_rtu->baud = baud; ctx_rtu->config = config; + ctx_rtu->rs485 = rs485; #else ctx_rtu->device = NULL; diff --git a/src/libmodbus/modbus-rtu.h b/src/libmodbus/modbus-rtu.h index 1237403..4c55789 100644 --- a/src/libmodbus/modbus-rtu.h +++ b/src/libmodbus/modbus-rtu.h @@ -8,8 +8,13 @@ #ifndef MODBUS_RTU_H #define MODBUS_RTU_H +#ifdef ARDUINO +class RS485Class; +#endif + #include "modbus.h" + MODBUS_BEGIN_DECLS /* Modbus_Application_Protocol_V1_1b.pdf Chapter 4 Section 1 Page 5 @@ -18,7 +23,7 @@ MODBUS_BEGIN_DECLS #define MODBUS_RTU_MAX_ADU_LENGTH 256 #ifdef ARDUINO -MODBUS_API modbus_t* modbus_new_rtu(unsigned long baud, uint16_t config); +MODBUS_API modbus_t* modbus_new_rtu(unsigned long baud, uint16_t config, RS485Class* rs485); #else MODBUS_API modbus_t* modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit);