-4

我正在尝试UART使用STM32F407V6T6and CubeMx

正如我已经发布了一些strstr()功能问题。这里有一些新问题。

这是代码:

char rxBuff[10];
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  Green_Blink(100);
  Orange_Blink(100);
  Blue_Blink(100);
  Red_Blink(100);
  while (1)
  {

        HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);
        HAL_Delay(1000);
        Orange_Blink(100);
        if (strstr(rxBuff,"hi"))
        {

        }
   }
}

我在这里做的是hello\r\n使用传输中断进行传输。传输后,我正在检查某些值,例如hiin rxBuff[10]

在这个特定的代码中,我没有收到任何我刚刚创建的缓冲区并检查它是否包含的东西hi

请注意,在传输时,我只发送 7 个字节的数据。但是在HAL_UART_Transmit_IT()大小我给10的地方。

HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);

将此代码闪烁到我的 stm32 后,我可以在终端中看到各种输出,例如

你好\r\n你好

如果我将 txt 从更改为hi行星之类的其他东西,那么输出将是

你好\r\npl

但是当我给出这样的完美尺寸时

HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",7);

我得到了我应该得到的实际输出

你好\r\n

通过 UART 传输数据并查找某个缓冲区中是否存在子字符串是完全不同的任务。

有什么建议为什么会发生这种情况?

PS:基本上我的项目是使用 GSM MODULE SIM800c 和 STM32f407VGt6 我想从 stm32 发送各种 AT 命令并检查响应,以便我可以相应地工作。

以前我曾用 AVR 系列 mcus 尝试过这个项目,我可以发送短信,接收特定短信,使用 post 和 get 方法将数据发送到服务器,一切正常。

转移到 ARM 后,我不知道 STM32 的表现如何。

4

3 回答 3

5

这与功能无关strstr。您告诉HAL_UART_Transmit_IT要阅读超出数组末尾的内容(字符串文字)"hello\r\n"。任何人都在猜测它会发现什么,这是未定义的行为。

于 2018-08-14T13:18:43.220 回答
2

在这条线上:

HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);

你告诉它传输 10 个字节。"hello\r\n"只有 7 个字节 + NULL 终止符,因此它还会在内存中发送下一个内容,在这种情况下,您正在使用的其他字符串的前 2 个字节在strstr.

于 2018-08-14T13:18:33.673 回答
1

您的"hello\r\n"字符串被放置在程序的某个只读区域中。这对于您的hiplanets字符串是相同的。编译器将这些字符串一个接一个地放入内存中(或者更好地说,链接器),并且由于您没有指定字符串的确切内存长度,因此您打印出是否有效。

你很幸运,两个字符串一个接一个地在内存中。

h e l l o \r \n \0 p l a n e t s.

由于您打印了10字符,因此您打印hello\r\n了 , 后跟NULL termination, 然后pl, 一起10字符。

经验教训:不要访问不允许访问的内存。您只能访问strlen("hello\r\n") + 1字节。

于 2018-08-14T13:17:50.453 回答