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:
8:595258a79939
Parent:
7:cfe1e0eafb7e
Child:
9:d49cdc77f867
diff -r cfe1e0eafb7e -r 595258a79939 dlms_comms.cpp
--- a/dlms_comms.cpp	Tue Nov 11 19:19:47 2014 +0000
+++ b/dlms_comms.cpp	Tue Nov 11 20:29:49 2014 +0000
@@ -8,9 +8,9 @@
    // 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);
-//bool dir_485 = 0;   
-
+  // DigitalOut dir_485 (PB_0);
+  DigitalOut dir_485 (D7);
+  
 /** ---------------------------------------------------------------------------
  * @brief  C O N S T R U C T O R
  */
@@ -31,10 +31,9 @@
 //                 &dlms_comms::Tx_interrupt,
 //                 //RawSerial::TxIrq
 //                 Serial::TxIrq);
+    // attach the receiver input to 'run' a method
     
-    // attach the receiver input to 'run' a method
-    rs485.attach(NULL, Serial::TxIrq);
-                
+    
     // when characters received
     rs485.attach(this,
                  &dlms_comms::Rx_interrupt,
@@ -46,12 +45,12 @@
     rx_irq_count = 0l;
     
     
-        /** Set the flow control type on the serial port
-     *
-     *  @param type the flow control type (Disabled, RTS, CTS, RTSCTS)
-     *  @param flow1 the first flow control pin (RTS for RTS or RTSCTS, CTS for CTS)
-     *  @param flow2 the second flow control pin (CTS for RTSCTS)
-     */
+//        /** Set the flow control type on the serial port
+//     *
+//     *  @param type the flow control type (Disabled, RTS, CTS, RTSCTS)
+//     *  @param flow1 the first flow control pin (RTS for RTS or RTSCTS, CTS for CTS)
+//     *  @param flow2 the second flow control pin (CTS for RTSCTS)
+//     */
 //    rs485.set_flow_control(RTSCTS , //Flow type, 
 //                           dir_485, //PB_0, //PinName flow1=NC, 
 //                           dir_485 //PB_0 //PinName flow2=NC
@@ -140,8 +139,8 @@
     tx_irq_count++;
     // enable the receiver, we are finito with the transmission of characters
     // this changes the direction on the transceiver buffer
-    rs485.attach(NULL, Serial::RxIrq);
-    dir_485 = 0;       
+    if (dir_485 == 1)
+        dir_485 = 0;       
 }
 /** ---------------------------------------------------------------------------
  * @brief dlms_comms::Rx_interrupt . This method received all characters from
@@ -204,10 +203,10 @@
     {
         rs485.putc (*tmp_ptr++);
     }
+    //
     rs485.attach(this,
                  &dlms_comms::Tx_interrupt,
-                 //RawSerial::TxIrq
-                 Serial::TxIrq);
+                Serial::TxIrq);
 }
 UINT_64 dlms_comms::ret_rx_irq_count (void)
 {