C 中的 strstr 问题

问题描述 投票:0回答:1

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

我的 UART 中断将字符存储到数组中并递增计数器。下面是我的 main 函数中的代码:

  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{345,678},它会将 startindex 设置为 3(这就是我想要的)。已成功进入循环,设置 startindex,并正确清除 UART_RX_Buffer 和计数器。

奇怪的是它只在第一次时有效。如果我第二次发送它,我可以看到缓冲区保存与第一次相同的数据。 。 。但它没有进入第一个循环,识别“{”字符。如果我没有正确处理 UART 中断并且缓冲区没有被正确填充,我就会发现一个问题。 。 。但情况似乎并非如此。我真的不明白为什么看似相同的数据会得到不同的结果(特别是如果我在尝试运行该行时可以确认数据位于 UART 缓冲区中)。

显然我错过了一些东西。有什么想法可能导致这种情况吗?如果有帮助,它是一个 STM32L4R5ZI 芯片(尽管我认为这是一个 C 问题而不是特定于设备)。我将包含调试器的屏幕截图,以防有帮助。预先感谢

c stm32 strstr
1个回答
0
投票

c 中的 strstr 问题

不,这始终是您的代码问题。

strstr
,编译器、链接器和硅胶都OK。

(特别是当我可以确认数据在 UART 缓冲区中时 尝试运行该线路)。

但这不是您认为拥有的数据:)

C 字符串是empty,因为它以 NULL 终止字符开头。

strstr
看到空字符串。你的缓冲区填充算法肯定坏了。

© www.soinside.com 2019 - 2024. All rights reserved.