Basic services for RF XBee modules
Dependents: frdm_MasterVehicle
xbee.cpp@0:a2bdcc45d1dc, 2014-10-18 (annotated)
- Committer:
- josepesado
- Date:
- Sat Oct 18 13:01:23 2014 +0000
- Revision:
- 0:a2bdcc45d1dc
XBee services
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
josepesado | 0:a2bdcc45d1dc | 1 | #include "mbed.h" |
josepesado | 0:a2bdcc45d1dc | 2 | |
josepesado | 0:a2bdcc45d1dc | 3 | #define XBEE_SERVER 1 |
josepesado | 0:a2bdcc45d1dc | 4 | #define XBEE_CLIENT 1 |
josepesado | 0:a2bdcc45d1dc | 5 | #define SERIAL_BAUDRATE 115200 |
josepesado | 0:a2bdcc45d1dc | 6 | #define BUFFER_SIZE 9 |
josepesado | 0:a2bdcc45d1dc | 7 | #define BUFFER_FORMAT "%X%X%X%X%X%X%X%X%X" |
josepesado | 0:a2bdcc45d1dc | 8 | #define BUFFER_FORMAT_RX "%c%c%c%c%c%c%c%c%c" |
josepesado | 0:a2bdcc45d1dc | 9 | #define BUFFER_RX_DATA_WR &CommandRx[0],&CommandRx[1],&CommandRx[2],&CommandRx[3],\ |
josepesado | 0:a2bdcc45d1dc | 10 | &CommandRx[4],&CommandRx[5],&CommandRx[6],&CommandRx[7],\ |
josepesado | 0:a2bdcc45d1dc | 11 | &CommandRx[8] |
josepesado | 0:a2bdcc45d1dc | 12 | #define BUFFER_RX_DATA_RD CommandRx[0],CommandRx[1],CommandRx[2],CommandRx[3],\ |
josepesado | 0:a2bdcc45d1dc | 13 | CommandRx[4],CommandRx[5],CommandRx[6],CommandRx[7],\ |
josepesado | 0:a2bdcc45d1dc | 14 | CommandRx[8] |
josepesado | 0:a2bdcc45d1dc | 15 | |
josepesado | 0:a2bdcc45d1dc | 16 | Serial PC(USBTX, USBRX); |
josepesado | 0:a2bdcc45d1dc | 17 | DigitalOut Indicator(LED_GREEN); |
josepesado | 0:a2bdcc45d1dc | 18 | int XBee_u16Loop; |
josepesado | 0:a2bdcc45d1dc | 19 | |
josepesado | 0:a2bdcc45d1dc | 20 | #if XBEE_SERVER == 1 |
josepesado | 0:a2bdcc45d1dc | 21 | Serial XBeeServer(PTC17, PTC16); /* Tx, Rx*/ |
josepesado | 0:a2bdcc45d1dc | 22 | char CommandTx[BUFFER_SIZE+1]={0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, '\0'}; |
josepesado | 0:a2bdcc45d1dc | 23 | DigitalOut RSTServer(PTB9); |
josepesado | 0:a2bdcc45d1dc | 24 | int XBee_u16TxResult; |
josepesado | 0:a2bdcc45d1dc | 25 | int XBee_u8TxRq; |
josepesado | 0:a2bdcc45d1dc | 26 | #endif |
josepesado | 0:a2bdcc45d1dc | 27 | |
josepesado | 0:a2bdcc45d1dc | 28 | #if XBEE_CLIENT == 1 |
josepesado | 0:a2bdcc45d1dc | 29 | Serial XBeeClient(PTE24, PTE25); /* Tx, Rx*/ |
josepesado | 0:a2bdcc45d1dc | 30 | DigitalOut RSTClient(PTA1); |
josepesado | 0:a2bdcc45d1dc | 31 | char CommandRx[BUFFER_SIZE+1]; |
josepesado | 0:a2bdcc45d1dc | 32 | volatile int XBee_u8RxResult; |
josepesado | 0:a2bdcc45d1dc | 33 | int XBee_boRxIndication = 0; |
josepesado | 0:a2bdcc45d1dc | 34 | int XBee_boRxAllowed = 1; |
josepesado | 0:a2bdcc45d1dc | 35 | |
josepesado | 0:a2bdcc45d1dc | 36 | /* This function is called when a character goes into the RX buffer.*/ |
josepesado | 0:a2bdcc45d1dc | 37 | void XBeeClientRx() { |
josepesado | 0:a2bdcc45d1dc | 38 | if(XBee_boRxAllowed == 1) |
josepesado | 0:a2bdcc45d1dc | 39 | { |
josepesado | 0:a2bdcc45d1dc | 40 | PC.printf("\r\nRx... "); |
josepesado | 0:a2bdcc45d1dc | 41 | XBee_u8RxResult = 0; |
josepesado | 0:a2bdcc45d1dc | 42 | XBee_u8RxResult = XBeeClient.scanf( BUFFER_FORMAT_RX, BUFFER_RX_DATA_WR ); |
josepesado | 0:a2bdcc45d1dc | 43 | if(XBee_u8RxResult>0) |
josepesado | 0:a2bdcc45d1dc | 44 | { |
josepesado | 0:a2bdcc45d1dc | 45 | XBee_boRxIndication = 1; |
josepesado | 0:a2bdcc45d1dc | 46 | } |
josepesado | 0:a2bdcc45d1dc | 47 | PC.printf("\r\nRx done [%i]. ",XBee_u8RxResult); |
josepesado | 0:a2bdcc45d1dc | 48 | PC.printf( BUFFER_FORMAT, BUFFER_RX_DATA_RD ); |
josepesado | 0:a2bdcc45d1dc | 49 | } |
josepesado | 0:a2bdcc45d1dc | 50 | return; |
josepesado | 0:a2bdcc45d1dc | 51 | } |
josepesado | 0:a2bdcc45d1dc | 52 | #endif |
josepesado | 0:a2bdcc45d1dc | 53 | |
josepesado | 0:a2bdcc45d1dc | 54 | void XBee_vInit(void) |
josepesado | 0:a2bdcc45d1dc | 55 | { |
josepesado | 0:a2bdcc45d1dc | 56 | XBee_u16Loop = 0; |
josepesado | 0:a2bdcc45d1dc | 57 | |
josepesado | 0:a2bdcc45d1dc | 58 | PC.baud(SERIAL_BAUDRATE); |
josepesado | 0:a2bdcc45d1dc | 59 | |
josepesado | 0:a2bdcc45d1dc | 60 | #if XBEE_SERVER == 1 |
josepesado | 0:a2bdcc45d1dc | 61 | PC.printf("\r\nSetting server XBee..."); |
josepesado | 0:a2bdcc45d1dc | 62 | XBeeServer.baud(SERIAL_BAUDRATE); |
josepesado | 0:a2bdcc45d1dc | 63 | XBee_u16TxResult = 0; |
josepesado | 0:a2bdcc45d1dc | 64 | XBee_u8TxRq = 0; |
josepesado | 0:a2bdcc45d1dc | 65 | #endif |
josepesado | 0:a2bdcc45d1dc | 66 | |
josepesado | 0:a2bdcc45d1dc | 67 | #if XBEE_CLIENT == 1 |
josepesado | 0:a2bdcc45d1dc | 68 | PC.printf("\r\nSetting client XBee..."); |
josepesado | 0:a2bdcc45d1dc | 69 | XBeeClient.baud(SERIAL_BAUDRATE); |
josepesado | 0:a2bdcc45d1dc | 70 | XBeeClient.attach(&XBeeClientRx, Serial::RxIrq); |
josepesado | 0:a2bdcc45d1dc | 71 | XBee_u8RxResult = 0; |
josepesado | 0:a2bdcc45d1dc | 72 | XBee_boRxAllowed = 1; |
josepesado | 0:a2bdcc45d1dc | 73 | #endif |
josepesado | 0:a2bdcc45d1dc | 74 | |
josepesado | 0:a2bdcc45d1dc | 75 | /* XBee reset*/ |
josepesado | 0:a2bdcc45d1dc | 76 | #if XBEE_SERVER == 1 |
josepesado | 0:a2bdcc45d1dc | 77 | RSTServer = 0; |
josepesado | 0:a2bdcc45d1dc | 78 | #endif |
josepesado | 0:a2bdcc45d1dc | 79 | #if XBEE_CLIENT == 1 |
josepesado | 0:a2bdcc45d1dc | 80 | RSTClient = 0; |
josepesado | 0:a2bdcc45d1dc | 81 | #endif |
josepesado | 0:a2bdcc45d1dc | 82 | wait_ms(1); |
josepesado | 0:a2bdcc45d1dc | 83 | #if XBEE_SERVER == 1 |
josepesado | 0:a2bdcc45d1dc | 84 | RSTServer = 1; |
josepesado | 0:a2bdcc45d1dc | 85 | #endif |
josepesado | 0:a2bdcc45d1dc | 86 | #if XBEE_CLIENT == 1 |
josepesado | 0:a2bdcc45d1dc | 87 | RSTClient = 1; |
josepesado | 0:a2bdcc45d1dc | 88 | #endif |
josepesado | 0:a2bdcc45d1dc | 89 | wait_ms(1); |
josepesado | 0:a2bdcc45d1dc | 90 | } |
josepesado | 0:a2bdcc45d1dc | 91 | |
josepesado | 0:a2bdcc45d1dc | 92 | void XBee_vMain(void) |
josepesado | 0:a2bdcc45d1dc | 93 | { |
josepesado | 0:a2bdcc45d1dc | 94 | XBee_u16Loop++; |
josepesado | 0:a2bdcc45d1dc | 95 | PC.printf("\r\n[%i]:",XBee_u16Loop); |
josepesado | 0:a2bdcc45d1dc | 96 | |
josepesado | 0:a2bdcc45d1dc | 97 | if(XBee_u8TxRq == 1) |
josepesado | 0:a2bdcc45d1dc | 98 | { |
josepesado | 0:a2bdcc45d1dc | 99 | /* a Tx job request is active */ |
josepesado | 0:a2bdcc45d1dc | 100 | PC.printf("\r\nTx... "); |
josepesado | 0:a2bdcc45d1dc | 101 | /* disable rx */ |
josepesado | 0:a2bdcc45d1dc | 102 | XBee_boRxAllowed = 0; |
josepesado | 0:a2bdcc45d1dc | 103 | for (int i=0; i<BUFFER_SIZE; i++) |
josepesado | 0:a2bdcc45d1dc | 104 | { |
josepesado | 0:a2bdcc45d1dc | 105 | while (true) |
josepesado | 0:a2bdcc45d1dc | 106 | { |
josepesado | 0:a2bdcc45d1dc | 107 | if (XBeeServer.writeable()) |
josepesado | 0:a2bdcc45d1dc | 108 | { |
josepesado | 0:a2bdcc45d1dc | 109 | XBee_u16TxResult= XBeeServer.putc(CommandTx[i]); |
josepesado | 0:a2bdcc45d1dc | 110 | PC.printf("%X ", XBee_u16TxResult); |
josepesado | 0:a2bdcc45d1dc | 111 | break; |
josepesado | 0:a2bdcc45d1dc | 112 | } |
josepesado | 0:a2bdcc45d1dc | 113 | } |
josepesado | 0:a2bdcc45d1dc | 114 | } |
josepesado | 0:a2bdcc45d1dc | 115 | /* tx done */ |
josepesado | 0:a2bdcc45d1dc | 116 | PC.printf("\r\nTx done. "); |
josepesado | 0:a2bdcc45d1dc | 117 | XBee_u8TxRq = 0; |
josepesado | 0:a2bdcc45d1dc | 118 | /* enable rx */ |
josepesado | 0:a2bdcc45d1dc | 119 | XBee_boRxAllowed = 1; |
josepesado | 0:a2bdcc45d1dc | 120 | } |
josepesado | 0:a2bdcc45d1dc | 121 | } |
josepesado | 0:a2bdcc45d1dc | 122 | |
josepesado | 0:a2bdcc45d1dc | 123 | #if 0 |
josepesado | 0:a2bdcc45d1dc | 124 | |
josepesado | 0:a2bdcc45d1dc | 125 | int main() |
josepesado | 0:a2bdcc45d1dc | 126 | { |
josepesado | 0:a2bdcc45d1dc | 127 | char TxJob[BUFFER_SIZE+1] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, '\0'}; |
josepesado | 0:a2bdcc45d1dc | 128 | |
josepesado | 0:a2bdcc45d1dc | 129 | XBee_vInit(); |
josepesado | 0:a2bdcc45d1dc | 130 | |
josepesado | 0:a2bdcc45d1dc | 131 | while (true) { |
josepesado | 0:a2bdcc45d1dc | 132 | wait(0.2f); // wait a small period of time |
josepesado | 0:a2bdcc45d1dc | 133 | Indicator = !Indicator; // toggle a led |
josepesado | 0:a2bdcc45d1dc | 134 | |
josepesado | 0:a2bdcc45d1dc | 135 | XBee_vMain(); |
josepesado | 0:a2bdcc45d1dc | 136 | |
josepesado | 0:a2bdcc45d1dc | 137 | memcpy(CommandTx,TxJob,9); |
josepesado | 0:a2bdcc45d1dc | 138 | XBee_u8TxRq = 1; |
josepesado | 0:a2bdcc45d1dc | 139 | |
josepesado | 0:a2bdcc45d1dc | 140 | for(int i=0;i<BUFFER_SIZE;i++) |
josepesado | 0:a2bdcc45d1dc | 141 | { |
josepesado | 0:a2bdcc45d1dc | 142 | TxJob[i]++; |
josepesado | 0:a2bdcc45d1dc | 143 | } |
josepesado | 0:a2bdcc45d1dc | 144 | |
josepesado | 0:a2bdcc45d1dc | 145 | } |
josepesado | 0:a2bdcc45d1dc | 146 | } |
josepesado | 0:a2bdcc45d1dc | 147 | #endif |
josepesado | 0:a2bdcc45d1dc | 148 |