Skip to content

Commit 1c51a13

Browse files
committed
Make RS485Class a configurable argument for ModbusRTU*
Can be changed by either the constructor or begin() Ports and replaces #14
1 parent 4cd74c2 commit 1c51a13

7 files changed

+58
-22
lines changed

src/ModbusRTUClient.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,18 @@ ModbusRTUClientClass::ModbusRTUClientClass() :
3131
{
3232
}
3333

34+
ModbusRTUClientClass::ModbusRTUClientClass(RS485Class& rs485) :
35+
_rs485(&rs485), ModbusClient(1000)
36+
{
37+
}
38+
3439
ModbusRTUClientClass::~ModbusRTUClientClass()
3540
{
3641
}
3742

3843
int ModbusRTUClientClass::begin(unsigned long baudrate, uint16_t config)
3944
{
40-
modbus_t* mb = modbus_new_rtu(baudrate, config);
45+
modbus_t* mb = modbus_new_rtu(_rs485, baudrate, config);
4146

4247
if (!ModbusClient::begin(mb, 0x00)) {
4348
return 0;
@@ -46,4 +51,10 @@ int ModbusRTUClientClass::begin(unsigned long baudrate, uint16_t config)
4651
return 1;
4752
}
4853

54+
int ModbusRTUClientClass::begin(RS485Class& rs485, unsigned long baudrate, uint16_t config)
55+
{
56+
_rs485 = &rs485;
57+
return begin(baudrate, config);
58+
}
59+
4960
ModbusRTUClientClass ModbusRTUClient;

src/ModbusRTUClient.h

+6
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
#define _MODBUS_RTU_CLIENT_H_INCLUDED
2222

2323
#include "ModbusClient.h"
24+
#include <ArduinoRS485.h>
2425

2526
class ModbusRTUClientClass : public ModbusClient {
2627
public:
2728
ModbusRTUClientClass();
29+
ModbusRTUClientClass(RS485Class& rs485);
2830
virtual ~ModbusRTUClientClass();
2931

3032
/**
@@ -36,6 +38,10 @@ class ModbusRTUClientClass : public ModbusClient {
3638
* Return 1 on success, 0 on failure
3739
*/
3840
int begin(unsigned long baudrate, uint16_t config = SERIAL_8N1);
41+
int begin(RS485Class& rs485, unsigned long baudrate, uint16_t config = SERIAL_8N1);
42+
43+
private:
44+
RS485Class* _rs485;
3945
};
4046

4147
extern ModbusRTUClientClass ModbusRTUClient;

src/ModbusRTUServer.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@ ModbusRTUServerClass::ModbusRTUServerClass()
3030
{
3131
}
3232

33+
ModbusRTUServerClass::ModbusRTUServerClass(RS485Class& rs485) : _rs485(&rs485)
34+
{
35+
}
36+
3337
ModbusRTUServerClass::~ModbusRTUServerClass()
3438
{
3539
}
3640

3741
int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config)
3842
{
39-
modbus_t* mb = modbus_new_rtu(baudrate, config);
43+
modbus_t* mb = modbus_new_rtu(_rs485, baudrate, config);
4044

4145
if (!ModbusServer::begin(mb, id)) {
4246
return 0;
@@ -47,6 +51,12 @@ int ModbusRTUServerClass::begin(int id, unsigned long baudrate, uint16_t config)
4751
return 1;
4852
}
4953

54+
int ModbusRTUServerClass::begin(RS485Class& rs485, int id, unsigned long baudrate, uint16_t config)
55+
{
56+
_rs485 = &rs485;
57+
return begin(id, baudrate, config);
58+
}
59+
5060
void ModbusRTUServerClass::poll()
5161
{
5262
uint8_t request[MODBUS_RTU_MAX_ADU_LENGTH];

src/ModbusRTUServer.h

+6
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
#define _MODBUS_RTU_SERVER_H_INCLUDED
2222

2323
#include "ModbusServer.h"
24+
#include <ArduinoRS485.h>
2425

2526
class ModbusRTUServerClass : public ModbusServer {
2627
public:
2728
ModbusRTUServerClass();
29+
ModbusRTUServerClass(RS485Class& rs485);
2830
virtual ~ModbusRTUServerClass();
2931

3032
/**
@@ -37,11 +39,15 @@ class ModbusRTUServerClass : public ModbusServer {
3739
* Return 1 on success, 0 on failure
3840
*/
3941
int begin(int id, unsigned long baudrate, uint16_t config = SERIAL_8N1);
42+
int begin(RS485Class& rs485, int id, unsigned long baudrate, uint16_t config = SERIAL_8N1);
4043

4144
/**
4245
* Poll interface for requests
4346
*/
4447
virtual void poll();
48+
49+
private:
50+
RS485Class* _rs485 = &RS485;
4551
};
4652

4753
extern ModbusRTUServerClass ModbusRTUServer;

src/libmodbus/modbus-rtu-private.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#if defined(_WIN32)
1818
#include <windows.h>
1919
#elif defined(ARDUINO)
20-
// nothing extra needed
20+
#include <ArduinoRS485.h>
2121
#else
2222
#include <termios.h>
2323
#endif
@@ -49,6 +49,7 @@ typedef struct _modbus_rtu {
4949
#if defined(ARDUINO)
5050
unsigned long baud;
5151
uint16_t config;
52+
RS485Class* rs485;
5253
#else
5354
/* Device: "/dev/ttyS0", "/dev/ttyUSB0" or "/dev/tty.USA19*" on Mac OS X. */
5455
char *device;

src/libmodbus/modbus-rtu.cpp

+19-18
Original file line numberDiff line numberDiff line change
@@ -323,15 +323,15 @@ static ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_lengt
323323
DWORD n_bytes = 0;
324324
return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? (ssize_t)n_bytes : -1;
325325
#elif defined(ARDUINO)
326-
(void)ctx;
326+
modbus_rtu_t *ctx_rtu = (modbus_rtu_t*)ctx->backend_data;
327327

328328
ssize_t size;
329329

330-
RS485.noReceive();
331-
RS485.beginTransmission();
332-
size = RS485.write(req, req_length);
333-
RS485.endTransmission();
334-
RS485.receive();
330+
ctx_rtu->rs485->noReceive();
331+
ctx_rtu->rs485->beginTransmission();
332+
size = ctx_rtu->rs485->write(req, req_length);
333+
ctx_rtu->rs485->endTransmission();
334+
ctx_rtu->rs485->receive();
335335

336336
return size;
337337
#else
@@ -394,9 +394,9 @@ static ssize_t _modbus_rtu_recv(modbus_t *ctx, uint8_t *rsp, int rsp_length)
394394
#if defined(_WIN32)
395395
return win32_ser_read(&((modbus_rtu_t *)ctx->backend_data)->w_ser, rsp, rsp_length);
396396
#elif defined(ARDUINO)
397-
(void)ctx;
397+
modbus_rtu_t *ctx_rtu = (modbus_rtu_t*)ctx->backend_data;
398398

399-
return RS485.readBytes(rsp, rsp_length);
399+
return ctx_rtu->rs485->readBytes(rsp, rsp_length);
400400
#else
401401
return read(ctx->s, rsp, rsp_length);
402402
#endif
@@ -654,8 +654,8 @@ static int _modbus_rtu_connect(modbus_t *ctx)
654654
return -1;
655655
}
656656
#elif defined(ARDUINO)
657-
RS485.begin(ctx_rtu->baud, ctx_rtu->config);
658-
RS485.receive();
657+
ctx_rtu->rs485->begin(ctx_rtu->baud, ctx_rtu->config);
658+
ctx_rtu->rs485->receive();
659659
#else
660660
/* The O_NOCTTY flag tells UNIX that this program doesn't want
661661
to be the "controlling terminal" for that port. If you
@@ -1210,8 +1210,8 @@ static void _modbus_rtu_close(modbus_t *ctx)
12101210
#elif defined(ARDUINO)
12111211
(void)ctx_rtu;
12121212

1213-
RS485.noReceive();
1214-
RS485.end();
1213+
ctx_rtu->rs485->noReceive();
1214+
ctx_rtu->rs485->end();
12151215
#else
12161216
if (ctx->s != -1) {
12171217
tcsetattr(ctx->s, TCSANOW, &ctx_rtu->old_tios);
@@ -1228,10 +1228,10 @@ static int _modbus_rtu_flush(modbus_t *ctx)
12281228
ctx_rtu->w_ser.n_bytes = 0;
12291229
return (PurgeComm(ctx_rtu->w_ser.fd, PURGE_RXCLEAR) == FALSE);
12301230
#elif defined(ARDUINO)
1231-
(void)ctx;
1231+
modbus_rtu_t *ctx_rtu = (modbus_rtu_t*)ctx->backend_data;
12321232

1233-
while (RS485.available()) {
1234-
RS485.read();
1233+
while (ctx_rtu->rs485->available()) {
1234+
ctx_rtu->rs485->read();
12351235
}
12361236

12371237
return 0;
@@ -1256,14 +1256,14 @@ static int _modbus_rtu_select(modbus_t *ctx, fd_set *rset,
12561256
return -1;
12571257
}
12581258
#elif defined(ARDUINO)
1259-
(void)ctx;
1259+
modbus_rtu_t *ctx_rtu = (modbus_rtu_t*)ctx->backend_data;
12601260
(void)rset;
12611261

12621262
unsigned long wait_time_millis = (tv == NULL) ? 0 : (tv->tv_sec * 1000) + (tv->tv_usec / 1000);
12631263
unsigned long start = millis();
12641264

12651265
do {
1266-
s_rc = RS485.available();
1266+
s_rc = ctx_rtu->rs485->available();
12671267

12681268
if (s_rc >= length_to_read) {
12691269
break;
@@ -1330,7 +1330,7 @@ const modbus_backend_t _modbus_rtu_backend = {
13301330
};
13311331

13321332
#ifdef ARDUINO
1333-
modbus_t* modbus_new_rtu(unsigned long baud, uint16_t config)
1333+
modbus_t* modbus_new_rtu(RS485Class *rs485, unsigned long baud, uint16_t config)
13341334
#else
13351335
modbus_t* modbus_new_rtu(const char *device,
13361336
int baud, char parity, int data_bit,
@@ -1362,6 +1362,7 @@ modbus_t* modbus_new_rtu(const char *device,
13621362
ctx->backend_data = (modbus_rtu_t *)malloc(sizeof(modbus_rtu_t));
13631363
ctx_rtu = (modbus_rtu_t *)ctx->backend_data;
13641364
#ifdef ARDUINO
1365+
ctx_rtu->rs485 = rs485;
13651366
ctx_rtu->baud = baud;
13661367
ctx_rtu->config = config;
13671368
#else

src/libmodbus/modbus-rtu.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ MODBUS_BEGIN_DECLS
1818
#define MODBUS_RTU_MAX_ADU_LENGTH 256
1919

2020
#ifdef ARDUINO
21-
MODBUS_API modbus_t* modbus_new_rtu(unsigned long baud, uint16_t config);
21+
class RS485Class;
22+
MODBUS_API modbus_t* modbus_new_rtu(RS485Class *rs485, unsigned long baud, uint16_t config);
2223
#else
2324
MODBUS_API modbus_t* modbus_new_rtu(const char *device, int baud, char parity,
2425
int data_bit, int stop_bit);

0 commit comments

Comments
 (0)