STM32 - Strstr 函数无法正常工作(UART)
STM32 - Strstr function does not work as I expected (UART)
我试图在通过 UART 接收的另一个字符串中查找特定字符串。但是,我的函数returns0,虽然字符串不是uart里面接收到的字符串。这是我的功能:
bool GetCommand(UART_HandleTypeDef *huart, char *command, char *getCommand, uint8_t size) {
char *ptr;
if (HAL_UART_Receive_IT(huart,command,size) == HAL_OK) {
ptr = strstr(command,getCommand);
}
if (ptr) {
return 1;
} else {
return 0;
}
}
程序可与 gcc 一起使用,但当我在 Keil 上尝试时,它并没有像我预期的那样工作。你能帮忙解决这个问题吗?
试试这个:
在目标选项中选择 microlib
看这张图
您的问题不是函数 strstr()
。
这是您收集命令的方式
if(HAL_UART_Receive_IT(huart,command,size) == HAL_OK) {
ptr = strstr(command,getCommand);
}
HAL_UART_Receive_IT
是一个非阻塞函数,所以在配置USART后直接returns。您的命令数组中的这个字符串此时未定义。
使用HAL_UART_Receive()
或HAL_UART_RxCpltCallback()
在使用内存之前等待 UART 完成。不要使用未初始化的变量。除了另一个答案,你还可以轮询HAL_UART_State直到外设停止接收。
bool GetCommand(UART_HandleTypeDef *huart, char *command, char *getCommand, uint8_t size) {
if (HAL_UART_Receive_IT(huart,command,size) != HAL_OK) {
// handle error
return 0;
}
// wait until UART stops receiving
while ((HAL_UART_State(huart) & HAL_UART_STATE_BUSY_RX) == HAL_UART_STATE_BUSY_RX) {
continue;
}
return strstr(command, getCommand) != NULL;
}
我试图在通过 UART 接收的另一个字符串中查找特定字符串。但是,我的函数returns0,虽然字符串不是uart里面接收到的字符串。这是我的功能:
bool GetCommand(UART_HandleTypeDef *huart, char *command, char *getCommand, uint8_t size) {
char *ptr;
if (HAL_UART_Receive_IT(huart,command,size) == HAL_OK) {
ptr = strstr(command,getCommand);
}
if (ptr) {
return 1;
} else {
return 0;
}
}
程序可与 gcc 一起使用,但当我在 Keil 上尝试时,它并没有像我预期的那样工作。你能帮忙解决这个问题吗?
试试这个: 在目标选项中选择 microlib
看这张图
您的问题不是函数 strstr()
。
这是您收集命令的方式
if(HAL_UART_Receive_IT(huart,command,size) == HAL_OK) {
ptr = strstr(command,getCommand);
}
HAL_UART_Receive_IT
是一个非阻塞函数,所以在配置USART后直接returns。您的命令数组中的这个字符串此时未定义。
使用HAL_UART_Receive()
或HAL_UART_RxCpltCallback()
在使用内存之前等待 UART 完成。不要使用未初始化的变量。除了另一个答案,你还可以轮询HAL_UART_State直到外设停止接收。
bool GetCommand(UART_HandleTypeDef *huart, char *command, char *getCommand, uint8_t size) {
if (HAL_UART_Receive_IT(huart,command,size) != HAL_OK) {
// handle error
return 0;
}
// wait until UART stops receiving
while ((HAL_UART_State(huart) & HAL_UART_STATE_BUSY_RX) == HAL_UART_STATE_BUSY_RX) {
continue;
}
return strstr(command, getCommand) != NULL;
}