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
main.cpp
- Committer:
- gabrielrivas
- Date:
- 2015-01-19
- Revision:
- 0:220ae68e7dd4
- Child:
- 1:544f5f721159
File content as of revision 0:220ae68e7dd4:
#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; }