Example of how to handle the Modbus Slave RTU protocol using the mbed RTOS. This example can also be used as reference to implement other slow serial protocols.

Dependencies:   MessageQueue ModbusSlaveRTU SerialPortHandler mbed-rtos mbed

Revision:
0:220ae68e7dd4
Child:
1:544f5f721159
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 19 04:07:15 2015 +0000
@@ -0,0 +1,73 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "ModbusSlaveRTU.h"
+#include "MessageQueue.h"
+#include "SerialPortHandler.h"
+
+DigitalOut led(LED1);
+Serial pc(SERIAL_TX, SERIAL_RX);
+MessageQueue<uint8_t> txQueue(64);
+MessageQueue<uint8_t> rxQueue(64);
+SerialPortHandler sph(&pc, &txQueue, &rxQueue);
+ModbusSlaveRTU* mbus;
+Thread* modbus_process_thread;
+Thread* data_send_thread;
+
+uint8_t cRegs[]  = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
+uint8_t inRegs[] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
+uint8_t hRegs[]  = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
+
+ThreadSafeArray_t hR;
+ThreadSafeArray_t cR;
+ThreadSafeArray_t iR;
+    
+void rx_interrupt(void);
+
+void modbus_process (void const *args) {
+
+    while (true) {
+        mbus->FSM();
+        Thread::wait(10);    
+    }
+}
+
+void data_send_process(void const *args)
+{
+    while (true) { 
+       if (!txQueue.isEmpty())
+       {           
+           sph.transmitPacket();
+           txQueue.reset();
+       }
+       Thread::wait(500);
+    }    
+}
+
+int main (void) {
+    pc.attach(&rx_interrupt);
+    
+    hR.length = 20;
+    hR.data      = hRegs;
+    
+    cR.length = 20;
+    cR.data      = cRegs;
+
+    iR.length = 20;
+    iR.data      = inRegs;
+    
+    mbus = new ModbusSlaveRTU(0x01, &txQueue, &rxQueue, &cR, &iR, &hR);    
+    modbus_process_thread = new Thread(modbus_process);
+    data_send_thread= new Thread(data_send_process);
+    
+    while(true)
+    {
+        Thread::wait(1000);     
+        led = !led;
+        mbus->trigger();
+    }
+}
+
+void rx_interrupt(void) {
+    sph.receivePacket();
+    return;
+}