我正在尝试使用UART
和STM32F407V6T6
的{{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的运行方式。
答案 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"
字符串已放入程序的某些只读区域。您的hi
或planets
字符串也是如此。编译器将这些字符串一个接一个地放入内存(或更确切地说是链接器)中,并且由于您没有指定字符串的确切存储长度,因此打印出有效的字符串。
您很幸运,两个字符串都在记忆中陆续出现。
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
个字节。