UART接收字符串

时间:2015-06-24 09:11:38

标签: c arrays string msp430

我正在使用MSP430并在C中编写代码。我通过UART接收字符(工作)并将它们放入数组rxDataArray中。由于我使用的是MSP430G2211,因此内存有限。最大阵列大小为50,并且它不再构建/加载,并且说空间不足。

我的MSP430正在与ESP8266模块(wifi)进行通信,我正在使用“AT”命令。我收到了我的AT命令的回显,然后是响应(例如AT + RST用AT + RST响应......确定)。我很困惑使用C,我怎么能只用“ok”响应创建一个字符串,并检查它是否正常工作。我有数组中的数据,只是不确定如何选择数组的某些元素,创建一个字符串,并将其与“ok”响应进行比较。我习惯在C ++中使用CString,并且很困惑如何在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 个答案:

答案 0 :(得分:1)

您可以通过发送ATE0命令关闭回声。

另外,要找到预期的字符串响应,请按照以下步骤操作:

  1. 启用UART发送和接收中断。

  2. 完成命令传输后,您将开始在UART ISR中接收数据。

  3. 在接收中断时,启动一个1秒的定时器(您需要考虑波特率才能进行精确计算)。

  4. 跟踪UART ISR中接收的字节数。

  5. 现在,在计时器到期后,将null添加到缓冲区中最后一个接收字节的末尾。

  6. 现在,您可以使用C的字符串操作函数来查找预期的响应。