代码之家  ›  专栏  ›  技术社区  ›  Bob Dole

C中的strstr问题

  •  1
  • Bob Dole  · 技术社区  · 1 年前

    我使用strstr来搜索括号的开头和结尾,这样我就可以从我真正想要/需要的信息中过滤掉UART上发送的不正确条目。

    我的UART中断将字符存储到一个数组中,并递增计数器。以下是我的主要功能中的代码:

      volatile char     UART_RX_Buffer[128]; // updated in UART
      volatile uint16_t UART_Byte_Counter = 0; // updated in UART
      
      while (1)
      {
            if(strstr(&UART_RX_Buffer[0], "{") != NULL)
            {
                if(strstr(&UART_RX_Buffer[0], "}") != NULL)
                {
                    char *ret;
                    int startindex;
    
                    ret = strstr(&UART_RX_Buffer[0], "{");
                    startindex = (ret - UART_RX_Buffer);
    
                    // Clear out UART array and counter
                    char Empty_Buffer[128] = {0};
                    memcpy (UART_RX_Buffer, Empty_Buffer, sizeof(UART_RX_Buffer));
                    UART_Byte_Counter = 0;
                }
            }
      }
    

    因此,如果我发送它,比如012{345678},它会将startindex设置为3(这就是我想要的)。它成功地进入了循环,设置了startindex,并正确地清除了UART_RX_Buffer和计数器。

    奇怪的是,它只是第一次通过。如果我第二次发送,我可以看到缓冲区中保存的数据与第一次相同。但它并没有进入第一个循环,识别出“{”性格如果我没有正确处理UART中断,并且缓冲区没有正确填充,我会看到一个问题。但事实并非如此。我真的不明白为什么我会用看起来相同的数据得到不同的结果(尤其是如果我能在尝试运行该行时确认数据在UART缓冲区中)。

    很明显我错过了什么。有什么想法可能导致这种情况吗?如果有帮助的话,它是一个STM32L4R5ZI芯片(尽管我认为这是一个C问题,不是特定于设备的)。我将包括调试器的屏幕截图,以防有帮助。提前感谢 enter image description here !

    1 回复  |  直到 1 年前
        1
  •  3
  •   gulpr    1 年前

    c中的strstr问题

    不,这始终是您的代码问题。 strstr ,编译器、链接器和硅胶都可以。

    (尤其是当我能确认数据在UART缓冲区时 试图跑那条线)。

    但这并不是你认为自己拥有的数据:)

    enter image description here C刺是 空的 因为它开始于 空终止字符 . 字符串查找 看到空字符串。你的缓冲区填充算法肯定坏了。

    我甚至可以告诉你,你还没有更新当前缓冲区位置的索引或指针 '0' 转到上一个转换结束的位置: enter image description here