Basic services for RF XBee modules

Dependents:   frdm_MasterVehicle

Committer:
josepesado
Date:
Sat Oct 18 13:01:23 2014 +0000
Revision:
0:a2bdcc45d1dc
XBee services

Who changed what in which revision?

UserRevisionLine numberNew 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