This is a RS485 class that uses the second UART and was tested on a Nucleo F030R8. A main demo program howto use the class is included. This class control the direction pin on the transceiver buffer automatically, and used transmit and receive interrupts. Ring buffers (256 bytes) are implemented on both transmission and reception. It assumes a ADM3485 'type' buffer where pins 2 ans 3 are connected and seen as direction. This test program could easily be adapted as base for other programs.

Dependencies:   mbed

Revision:
9:d49cdc77f867
Parent:
8:595258a79939
Child:
10:e104a1b24165
--- a/dlms_comms.cpp	Tue Nov 11 20:29:49 2014 +0000
+++ b/dlms_comms.cpp	Tue Nov 11 20:59:43 2014 +0000
@@ -8,7 +8,7 @@
    // Instantiate the raw serial (2nd uart) Tx then Rx
    RawSerial  rs485(PA_9, PA_10);
   // pin to switch the rs485 buffer direction
-  // DigitalOut dir_485 (PB_0);
+  //DigitalOut dir_485 (PB_0);
   DigitalOut dir_485 (D7);
   
 /** ---------------------------------------------------------------------------
@@ -24,15 +24,8 @@
     rx_tail_ptr = 0;
     memset (rx_buffer, 0, sizeof(rx_buffer));
 
-    // transmit empty flag .. need to set buffer
-    // in receive mode again after we have transmitted
-    // all data characters
-//    rs485.attach(this,
-//                 &dlms_comms::Tx_interrupt,
-//                 //RawSerial::TxIrq
-//                 Serial::TxIrq);
     // attach the receiver input to 'run' a method
-    
+    rs485.attach(NULL, Serial::TxIrq);
     
     // when characters received
     rs485.attach(this,
@@ -139,8 +132,8 @@
     tx_irq_count++;
     // enable the receiver, we are finito with the transmission of characters
     // this changes the direction on the transceiver buffer
-    if (dir_485 == 1)
-        dir_485 = 0;       
+    rs485.attach(NULL, Serial::TxIrq);
+    dir_485 = 0;       
 }
 /** ---------------------------------------------------------------------------
  * @brief dlms_comms::Rx_interrupt . This method received all characters from
@@ -203,10 +196,9 @@
     {
         rs485.putc (*tmp_ptr++);
     }
-    //
     rs485.attach(this,
                  &dlms_comms::Tx_interrupt,
-                Serial::TxIrq);
+                 Serial::TxIrq);
 }
 UINT_64 dlms_comms::ret_rx_irq_count (void)
 {