UART receive string

2.4k views Asked by At

I am using an MSP430 and writing code in C. I am receiving characters (working) via UART and placing them into an array rxDataArray. Since I am using an MSP430G2211, I have limited memory. The maximum array size is 50 and any more it won't build/load and says out of space.

My MSP430 is communicating to a ESP8266 module (wifi) where I am using "AT" commands. I am receive an echo of my AT command, followed by a response (ex. AT+RST responds with AT+RST...ok). I am confused using C, how I can make a string with just the "ok" response and check if it worked correctly. I have the data in the array, just not sure how to pick certain elements of the array, make a string, and compare that to "ok" response. I am used to using CString in C++ and am confused how to do this in C.

/--------------------------------------------------------------------
// Timer_A UART - Receive Interrupt Handler
//-------------------------------------------------------------------
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMERA1_VECTOR))) Timer_A1_ISR (void)
#else
#error Compiler not supported!
#endif
{  
static unsigned char rxBitCnt = 8;
static unsigned char rxData = 0;

switch (__even_in_range(TAIV, TAIV_TAIFG)) { // Use calculated branching
    case TAIV_TACCR1:                        // TACCR1 CCIFG - UART RX
        TACCR1 += UART_TBIT;                 // Add Offset to CCRx
        if (TACCTL1 & CAP) {                 // Capture mode = start bit edge
            TACCTL1 &= ~CAP;                 // Switch capture to compare mode
            TACCR1 += UART_TBIT_DIV_2;       // Point CCRx to middle of D0
        }
        else {
            rxData >>= 1;
            if (TACCTL1 & SCCI) {            // Get bit waiting in receive latch
                rxData |= 0x80;
            }
            rxBitCnt--;
            if (rxBitCnt == 0) {             // All bits RXed?
                rxBuffer = rxData;           // Store in global variable

                if (rxDataCnt < 50)
                {
                    rxDataArray[rxDataCnt] = rxBuffer;
                    rxDataCnt++;
                }
                else
                {
                    int i = 0;
                    for (i; i<50-1; i++)
                    {
                        rxDataArray[i] = rxDataArray[i+1];
                    }

                    rxDataArray[50-1] = rxBuffer;
                }

                rxBitCnt = 8;                // Re-load bit counter
                TACCTL1 |= CAP;              // Switch compare to capture mode
                __bic_SR_register_on_exit(LPM0_bits);  // Clear LPM0 bits from 0(SR)
            }
        }
        break;
    }
}
//-----------------------------------------------------------------------
1

There are 1 answers

1
Vagish On

You can turn OFF echo by sending ATE0 command.

Also to find the intended string response please follow below steps:

  1. Enable UART Transmit and Receive Interrupt.

  2. After completing your command transmission you will start receiving data in UART ISR.

  3. In the receive interrupt start a timer of say 1 second(You need to consider baud-rate for exact calculation).

  4. Make track of number of received bytes in UART ISR.

  5. Now after timer expires add null to end of last received byte in buffer.

Now,You can use string manipulation functions of C to find the intended response.