summaryrefslogtreecommitdiff
path: root/examples/arduino/arduino.ino
diff options
context:
space:
mode:
Diffstat (limited to 'examples/arduino/arduino.ino')
-rw-r--r--examples/arduino/arduino.ino64
1 files changed, 64 insertions, 0 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;
+}
+