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

Committer:
creatron
Date:
Tue Nov 11 20:59:43 2014 +0000
Revision:
9:d49cdc77f867
Parent:
6:70460dcbc43c
Child:
11:ca1e0ca3a673
This version seem to work both transmit and receive

Who changed what in which revision?

UserRevisionLine numberNew contents of line
creatron 0:044dfba47660 1 #include "mbed.h"
creatron 0:044dfba47660 2 #include "dlms_comms.h"
creatron 0:044dfba47660 3 // instantiate classes
creatron 0:044dfba47660 4 Timer timer;
creatron 0:044dfba47660 5 // debug serial comms
creatron 0:044dfba47660 6 RawSerial debugger(SERIAL_TX, SERIAL_RX);
creatron 0:044dfba47660 7 // rs485 comms 2nd uart
creatron 0:044dfba47660 8 dlms_comms dlms;
creatron 0:044dfba47660 9
creatron 0:044dfba47660 10 DigitalOut myled(LED1);
creatron 0:044dfba47660 11
creatron 0:044dfba47660 12 #define POLL_TIME_MS 100
creatron 0:044dfba47660 13
creatron 0:044dfba47660 14 /** -------------------------------------------------------------------------
creatron 0:044dfba47660 15 * @brief the setup routine runs once when you press reset
creatron 0:044dfba47660 16 */
creatron 0:044dfba47660 17 void setup(void)
creatron 0:044dfba47660 18 {
creatron 0:044dfba47660 19 // initialize serial communication at 115200 bits per second:
creatron 0:044dfba47660 20 debugger.baud (115200);
creatron 0:044dfba47660 21 debugger.format();
creatron 0:044dfba47660 22 debugger.printf ("\r\n\n>> DCU Battery Charger Nov 2014 \r\n");
creatron 0:044dfba47660 23 timer.start();
creatron 0:044dfba47660 24 dlms.init ( &debugger, &timer);
creatron 0:044dfba47660 25 dlms.initialise (9600, // baudrate
creatron 0:044dfba47660 26 8, // bits,
creatron 0:044dfba47660 27 'n', // parity
creatron 9:d49cdc77f867 28 1); // stop_bits
creatron 0:044dfba47660 29 debugger.printf (">> Setup Done \r\n");
creatron 0:044dfba47660 30 }
creatron 0:044dfba47660 31 /** ---------------------------------------------------------------------------
creatron 0:044dfba47660 32 * @brief M A I N
creatron 0:044dfba47660 33 */
creatron 0:044dfba47660 34 int main(void)
creatron 0:044dfba47660 35 {
creatron 0:044dfba47660 36 // timer to do some timing
creatron 0:044dfba47660 37 UINT_64 compare_ms = 0l;
creatron 0:044dfba47660 38 UINT_64 current_ms;
creatron 0:044dfba47660 39 bool direction_485 = false;
creatron 0:044dfba47660 40 char ch;
creatron 0:044dfba47660 41
creatron 0:044dfba47660 42 // initialise
creatron 0:044dfba47660 43 setup();
creatron 0:044dfba47660 44 debugger.printf (">> Demo .. \r\n");
creatron 0:044dfba47660 45 do
creatron 0:044dfba47660 46 {
creatron 0:044dfba47660 47 current_ms = timer.read_ms();
creatron 0:044dfba47660 48 current_ms -= compare_ms;
creatron 0:044dfba47660 49 if (current_ms > POLL_TIME_MS)
creatron 0:044dfba47660 50 {
creatron 0:044dfba47660 51 compare_ms += POLL_TIME_MS;
creatron 0:044dfba47660 52 if (myled)
creatron 0:044dfba47660 53 myled = false;
creatron 0:044dfba47660 54 else
creatron 0:044dfba47660 55 myled = true;
creatron 0:044dfba47660 56 }
creatron 0:044dfba47660 57 if (direction_485 != dlms.get_dir485())
creatron 0:044dfba47660 58 {
creatron 0:044dfba47660 59 direction_485 = dlms.get_dir485();
creatron 0:044dfba47660 60 debugger.printf("\r\nDir Changed ");
creatron 0:044dfba47660 61 if (direction_485)
creatron 0:044dfba47660 62 debugger.printf("1 \r\n");
creatron 0:044dfba47660 63 else
creatron 0:044dfba47660 64 debugger.printf("0 \r\n");
creatron 0:044dfba47660 65 }
creatron 1:7091401482c5 66 if (debugger.readable())
creatron 1:7091401482c5 67 {
creatron 2:c99c596be3d1 68 ch = debugger.getc() & 0x7f;
creatron 1:7091401482c5 69 switch (ch)
creatron 1:7091401482c5 70 {
creatron 1:7091401482c5 71 case '1':
creatron 1:7091401482c5 72 dlms.send_packet ("\r\nDLMS Test 1 \r\n", 16);
creatron 1:7091401482c5 73 break;
creatron 1:7091401482c5 74 }
creatron 6:70460dcbc43c 75 debugger.printf (">> %c 0x%02X IRQ rxcount=%5ld txcount=%5ld Dir_485=%d\r\n", ch, ch,
creatron 3:29454cac7930 76 dlms.ret_rx_irq_count(),
creatron 6:70460dcbc43c 77 dlms.ret_tx_irq_count(),
creatron 6:70460dcbc43c 78 dlms.ret_dir_485());
creatron 1:7091401482c5 79 }
creatron 3:29454cac7930 80 if (dlms.char_available())
creatron 3:29454cac7930 81 {
creatron 3:29454cac7930 82 debugger.printf("Rx Char ");
creatron 3:29454cac7930 83 debugger.printf("%c\r\n", dlms.get_char());
creatron 3:29454cac7930 84 }
creatron 0:044dfba47660 85 }
creatron 0:044dfba47660 86 while (1);
creatron 0:044dfba47660 87 }
creatron 0:044dfba47660 88 //----[ then end]-------------------------------------------------------------
creatron 0:044dfba47660 89
creatron 0:044dfba47660 90