NucleoF401RE - XBee serial RX/TX with FIFO buffer. RX: Interrupt - FIFO buffering. TX: FIFO buffering - polling (tx_buffer empty). In this program, received data (7bytes format ([000000-7FFFFF]+13(cr)]) is merged to auto-increment message to transfer.

Dependencies:   mbed

Committer:
nagasm
Date:
Sat Dec 06 04:31:53 2014 +0000
Revision:
0:0d80708af8ce
NucleoF401RE + XBee Rx/Tx program.; RX - Interrupt - FIFO buffering.; TX - FIFO buffering - polling (buffer empty).; In this program, received message (7bytes format ([000000-7FFFFF]+13(cr)]) id merged to auto-increment data to transfer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nagasm 0:0d80708af8ce 1 #include "mbed.h"
nagasm 0:0d80708af8ce 2
nagasm 0:0d80708af8ce 3 unsigned char rxFIFO[256], txFIFO[256], raw_data[6];
nagasm 0:0d80708af8ce 4 unsigned char rx_top, rx_end, tx_top, tx_end, phase;
nagasm 0:0d80708af8ce 5
nagasm 0:0d80708af8ce 6 RawSerial xbee(PA_2, PA_3);
nagasm 0:0d80708af8ce 7 DigitalOut myled(LED1);
nagasm 0:0d80708af8ce 8
nagasm 0:0d80708af8ce 9 void tx_fifo_check(){
nagasm 0:0d80708af8ce 10 if(xbee.writeable() == 1){
nagasm 0:0d80708af8ce 11 if(tx_top != tx_end){
nagasm 0:0d80708af8ce 12 xbee.putc(txFIFO[tx_end]);
nagasm 0:0d80708af8ce 13 ++tx_end &= 255;
nagasm 0:0d80708af8ce 14 }
nagasm 0:0d80708af8ce 15 }
nagasm 0:0d80708af8ce 16 return;
nagasm 0:0d80708af8ce 17 }
nagasm 0:0d80708af8ce 18
nagasm 0:0d80708af8ce 19 int rx_fifo_check(){
nagasm 0:0d80708af8ce 20 unsigned char data;
nagasm 0:0d80708af8ce 21 if(rx_top != rx_end){
nagasm 0:0d80708af8ce 22 data = rxFIFO[rx_end];
nagasm 0:0d80708af8ce 23 ++rx_end &= 255;
nagasm 0:0d80708af8ce 24 if (data < 33){
nagasm 0:0d80708af8ce 25 phase = 0;
nagasm 0:0d80708af8ce 26 return(1);
nagasm 0:0d80708af8ce 27 }
nagasm 0:0d80708af8ce 28 raw_data[phase] = data;
nagasm 0:0d80708af8ce 29 if(++phase > 5) phase = 0;
nagasm 0:0d80708af8ce 30 return(0);
nagasm 0:0d80708af8ce 31 }
nagasm 0:0d80708af8ce 32 return(0);
nagasm 0:0d80708af8ce 33 }
nagasm 0:0d80708af8ce 34
nagasm 0:0d80708af8ce 35 void rx_fifoset(void){
nagasm 0:0d80708af8ce 36 rxFIFO[rx_top] = xbee.getc();
nagasm 0:0d80708af8ce 37 ++rx_top &= 255;
nagasm 0:0d80708af8ce 38 return;
nagasm 0:0d80708af8ce 39 }
nagasm 0:0d80708af8ce 40
nagasm 0:0d80708af8ce 41 void tx_fifoset(unsigned char data){
nagasm 0:0d80708af8ce 42 txFIFO[tx_top] = data;
nagasm 0:0d80708af8ce 43 ++tx_top &= 255;
nagasm 0:0d80708af8ce 44 return;
nagasm 0:0d80708af8ce 45 }
nagasm 0:0d80708af8ce 46
nagasm 0:0d80708af8ce 47 unsigned char hex_conv(unsigned char data){
nagasm 0:0d80708af8ce 48 data &= 15;
nagasm 0:0d80708af8ce 49 if(data < 10) return(data+48);
nagasm 0:0d80708af8ce 50 else return(data+55);
nagasm 0:0d80708af8ce 51 }
nagasm 0:0d80708af8ce 52
nagasm 0:0d80708af8ce 53 unsigned char conv_hex(unsigned char data){
nagasm 0:0d80708af8ce 54 if((data > 47) && (data < 58)) return(data-48);
nagasm 0:0d80708af8ce 55 else if((data > 64) && (data < 71)) return(data-55);
nagasm 0:0d80708af8ce 56 return(0);
nagasm 0:0d80708af8ce 57 }
nagasm 0:0d80708af8ce 58
nagasm 0:0d80708af8ce 59 void tx_message(int data){
nagasm 0:0d80708af8ce 60 int i;
nagasm 0:0d80708af8ce 61 for (i=0; i<6; i++){
nagasm 0:0d80708af8ce 62 tx_fifoset(hex_conv((data>>(4*(5-i))) & 15));
nagasm 0:0d80708af8ce 63 }
nagasm 0:0d80708af8ce 64 tx_fifoset(13);
nagasm 0:0d80708af8ce 65 }
nagasm 0:0d80708af8ce 66
nagasm 0:0d80708af8ce 67 int main(){
nagasm 0:0d80708af8ce 68 int i, j, k, sum;
nagasm 0:0d80708af8ce 69 i = j = k = 0;
nagasm 0:0d80708af8ce 70 rx_top = rx_end = tx_top = tx_end = phase = 0;
nagasm 0:0d80708af8ce 71 xbee.baud(38400);
nagasm 0:0d80708af8ce 72 xbee.attach(&rx_fifoset, xbee.RxIrq);
nagasm 0:0d80708af8ce 73 while(1){
nagasm 0:0d80708af8ce 74 tx_fifo_check();
nagasm 0:0d80708af8ce 75 if(rx_fifo_check() == 1){
nagasm 0:0d80708af8ce 76 sum = 0;
nagasm 0:0d80708af8ce 77 for (i=0; i<6; i++){
nagasm 0:0d80708af8ce 78 sum += conv_hex(raw_data[i])<<(4*(5-i));
nagasm 0:0d80708af8ce 79 }
nagasm 0:0d80708af8ce 80 tx_message(sum); /* Echo Back */
nagasm 0:0d80708af8ce 81 }
nagasm 0:0d80708af8ce 82 if(++j > 1000000){
nagasm 0:0d80708af8ce 83 j = 0;
nagasm 0:0d80708af8ce 84 myled = !myled;
nagasm 0:0d80708af8ce 85 k &= 8388607;
nagasm 0:0d80708af8ce 86 tx_message(k++);
nagasm 0:0d80708af8ce 87 }
nagasm 0:0d80708af8ce 88 }
nagasm 0:0d80708af8ce 89 }