summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAditya Naik2020-02-13 15:06:29 -0500
committerAditya Naik2020-02-13 15:06:29 -0500
commit78088e78539bdd5b4948f432f4747e7e1b7b75c8 (patch)
treee86ecf9844aee005ad858582f759e6a492b953eb
parentbe38e008fb0bae72983aa25e51182fa5f18f8e59 (diff)
Added Arduino examples, untested
-rw-r--r--examples/arduino/arduino.ino64
-rw-r--r--examples/stm32/main.c4
-rw-r--r--src/modbus.h7
3 files changed, 71 insertions, 4 deletions
diff --git a/examples/arduino/arduino.ino b/examples/arduino/arduino.ino
new file mode 100644
index 0000000..d6d2e1a
--- /dev/null
+++ b/examples/arduino/arduino.ino
@@ -0,0 +1,64 @@
+
+#include <modbus.h>
+
+/* Baud rate for UART */
+#define BAUD 9600
+
+/* To match the parameters of HardwareSerial Rx/Tx functions with the Modbus functions, wrappers around the ::read() and ::write() functions are required */
+MB_StatusTypeDef ArduinoSerial_Tx(void* serial, uint16_t* buf, uint8_t* len, uint8_t* timeout);
+MB_StatusTypeDef ArduinoSerial_Rx(void* serial, uint16_t* buf, uint8_t* len, uint8_t* timeout);
+
+MB_StatusTypeDef (*MB_UART_Tx)(void*, uint16_t*, uint8_t*, uint8_t*) = &ArduinoSerial_Tx;
+MB_StatusTypeDef (*MB_UART_Rx)(void*, uint16_t*, uint8_t*, uint8_t*) = &ArduinoSerial_Rx;
+
+/* Single modbus device node */
+modbus_slave_device modbus_dev_single;
+/* Multiple modbus device nodes.. after all, what is the point of using Modbus in a single point-to-point connection? */
+/* Not illustrated beyond the definition, but should be clear enough */
+modbus_slave_device modbus_dev_multiple[10];
+
+uint16_t reg;
+
+void setup()
+{
+ Serial.begin(BAUD);
+
+ /* Set the slave ID to 1 */
+ modbus_dev_single.slave_id = 1;
+ /* Attach the default HardwareSerial class instance to this node */
+ modbus_dev_single.modbus_uart = &Serial;
+
+ /* Continuously read the this input register in superloop */
+ reg = 30001;
+}
+
+void loop()
+{
+ MB_StatusTypeDef status = ReadInputRegisters(&modbus_dev_single, reg, 1);
+ if (status == MB_OK) {
+ /* Do something with data in the response buffer */
+ /* ... */
+ ClearResponseBuffer(&modbus_dev_single);
+ }
+}
+
+MB_StatusTypeDef ArduinoSerial_Tx(void* serial, uint16_t* buf, uint8_t* len, uint8_t* timeout)
+{
+ HardwareSerial* _serial = static_cast<HardwareSerial*>(serial);
+ if (_serial->availableForWrite()) {
+ _serial->write((uint8_t)*buf);
+ }
+ _serial->flush();
+ /* Arduino HardwareSerial class does not return any errors, sadly */
+ return MB_OK;
+}
+
+MB_StatusTypeDef ArduinoSerial_Rx(void* serial, uint16_t* buf, uint8_t* len, uint8_t* timeout)
+{
+ HardwareSerial* _serial = static_cast<HardwareSerial*>(serial);
+ buf = _serial->read();
+
+ /* Arduino HardwareSerial class does not return any errors, sadly */
+ return MB_OK;
+}
+
diff --git a/examples/stm32/main.c b/examples/stm32/main.c
index 7f63529..9e71ed9 100644
--- a/examples/stm32/main.c
+++ b/examples/stm32/main.c
@@ -1,4 +1,6 @@
-#include "modbus.h"
+// TODO Makefile
+
+#include <modbus.h>
/* If using CubeMX, the HAL library files will be automatically placed in the correct location. The examples were tested with the Makefile option in CubeMX. */
/* If you are not using CubeMX to initialize the project, you are on your own */
diff --git a/src/modbus.h b/src/modbus.h
index f556c0b..56cedb4 100644
--- a/src/modbus.h
+++ b/src/modbus.h
@@ -40,9 +40,10 @@ extern MB_StatusTypeDef (*MB_UART_Tx)(void*, uint16_t*, uint8_t*, uint8_t*);
extern MB_StatusTypeDef (*MB_UART_Rx)(void*, uint16_t*, uint8_t*, uint8_t*);
-MB_StatusTypeDef modbus_transaction(uint8_t func, modbus_slave_device *device,
- uint16_t rw_addr, int read_num,
- uint16_t write_value);
+static MB_StatusTypeDef modbus_transaction(uint8_t func,
+ modbus_slave_device *device,
+ uint16_t rw_addr, int read_num,
+ uint16_t write_value);
MB_StatusTypeDef ReadHoldingRegisters(modbus_slave_device *device,
uint16_t reg_addr,