使用strstr()后,子字符串也通过uart

时间:2018-08-14 13:15:15

标签: c strstr stm32f4 sim800

我正在尝试使用UARTSTM32F407V6T6的{​​{1}}。

我已经发布了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中的hi

在此特定代码中,我什么都没收到,我只是创建了缓冲区并检查缓冲区是否包含rxBuff[10]

请注意,在传输时,我只是发送7个字节的数据。但是在hi中,我给出了10。

HAL_UART_Transmit_IT()

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

  
    

你好\ r \ nhi

  

如果我将txt从HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);更改为其他类似行星的内容,则输出将类似于

  
    

你好\ r \ npl

  

但是当我给出这样的理想尺寸

hi

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

  
    

你好\ r \ n

  

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

有人建议为什么会这样吗?

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

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

转移到ARM之后,我无法了解STM32的运行方式。

3 个答案:

答案 0 :(得分:5)

这与strstr函数无关。您正在告诉HAL_UART_Transmit_IT超出数组末尾(字符串文字)"hello\r\n"进行读取。它会发现有人猜测,这是未定义的行为。

答案 1 :(得分:2)

在这一行:

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

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

答案 2 :(得分: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 terminationpl,共10个字符。

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