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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 unsigned char rxFIFO[256], txFIFO[256], raw_data[6];
00004 unsigned char rx_top, rx_end, tx_top, tx_end, phase;
00005 
00006 RawSerial xbee(PA_2, PA_3);
00007 DigitalOut myled(LED1);
00008 
00009 void tx_fifo_check(){
00010     if(xbee.writeable() == 1){
00011         if(tx_top != tx_end){
00012             xbee.putc(txFIFO[tx_end]);
00013             ++tx_end &= 255;
00014         }
00015     }
00016     return;
00017 }
00018 
00019 int rx_fifo_check(){
00020     unsigned char data;
00021     if(rx_top != rx_end){
00022         data = rxFIFO[rx_end];
00023         ++rx_end &= 255;
00024         if (data < 33){
00025             phase = 0;
00026             return(1);
00027         }
00028         raw_data[phase] = data;
00029         if(++phase > 5) phase = 0;
00030         return(0);
00031     }
00032     return(0);
00033 }
00034 
00035 void rx_fifoset(void){
00036     rxFIFO[rx_top] = xbee.getc();
00037     ++rx_top &= 255;
00038     return;
00039 }
00040 
00041 void tx_fifoset(unsigned char data){
00042     txFIFO[tx_top] = data;
00043     ++tx_top &= 255;
00044     return;
00045 }
00046 
00047 unsigned char hex_conv(unsigned char data){
00048     data &= 15;
00049     if(data < 10) return(data+48);
00050     else return(data+55);
00051 }
00052 
00053 unsigned char conv_hex(unsigned char data){
00054     if((data > 47) && (data < 58)) return(data-48);
00055     else if((data > 64) && (data < 71)) return(data-55);
00056     return(0);
00057 }
00058 
00059 void tx_message(int data){
00060     int i;
00061     for (i=0; i<6; i++){
00062         tx_fifoset(hex_conv((data>>(4*(5-i))) & 15));
00063     }
00064     tx_fifoset(13);
00065 }
00066 
00067 int main(){
00068     int i, j, k, sum;
00069     i = j = k = 0;
00070     rx_top = rx_end = tx_top = tx_end = phase = 0; 
00071     xbee.baud(38400);
00072     xbee.attach(&rx_fifoset, xbee.RxIrq);
00073     while(1){
00074         tx_fifo_check();
00075         if(rx_fifo_check() == 1){
00076             sum = 0;
00077             for (i=0; i<6; i++){
00078                 sum += conv_hex(raw_data[i])<<(4*(5-i));
00079             }
00080             tx_message(sum); /* Echo Back */
00081         }
00082         if(++j > 1000000){
00083             j = 0;
00084             myled = !myled;
00085             k &= 8388607;
00086             tx_message(k++);
00087         }
00088     }
00089 }