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.
Diff: dlms_comms.cpp
- 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) {