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.
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 }
Generated on Sat Aug 6 2022 04:23:06 by 1.7.2