c - UART接收字符串

标签 c arrays string msp430

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

我的 MSP430 正在与 ESP8266 模块 (wifi) 通信,我在其中使用“AT”命令。我收到 AT 命令的回显,然后是响应(例如 AT+RST 用 AT+RST 响应...ok)。我对使用 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;
    }
}
//-----------------------------------------------------------------------

最佳答案

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

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

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

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

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

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

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

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

关于c - UART接收字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31022419/

相关文章:

c - 根据条件无法访问

c - 如何按数字 block 打印 int 数组? (直方图打印)

python - 避免绘制数组不同轴的冗余代码

java - 如何切换字符串中的字母

c - strncmp 比 strcmp 快吗

java - 每次遇到字符时,在数组列表中拆分字符串

c - 如何检查用户输入的字符串是否与某些内容相同

c - 当操作数是 C 中的指针时,编译器如何处理运算符 +

c - 故意返回无效值或类型

c - 既不是参数也不是指针