После использования strstr() подстрока также передается через uart
Я пытался UART
с помощью STM32F407V6T6
а также 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]
,
В этом конкретном коде я не получаю ничего, я просто создал буфер и проверяю, содержит ли он hi
или нет.
Обратите внимание, что при передаче я просто отправляю 7 байтов данных. Но в HAL_UART_Transmit_IT()
в месте размера я даю 10.
HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);
После перепрограммирования этого кода на мой stm32 я вижу в терминале различные выходные данные, такие как
привет \ г \ ГМС
Если я изменю текст с hi
для какой-то другой вещи, как планеты, то результат будет как
привет \ г \ NPL
Но когда я даю идеальный размер, как это
HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",7);
Я получаю фактический результат, который я должен получать
Привет \ г \ п
Передача данных через UART и поиск наличия подстроки в каком-либо буфере - это совершенно разные задачи.
Любые предложения, почему это происходит?
PS: В основном мой проект с GSM-модулем SIM800c и STM32f407VGt6. Я хочу отправить различные AT-команды из stm32 и проверить ответ, чтобы я мог работать соответственно.
Ранее я пробовал этот проект с AVR серии mcus, где я мог отправлять смс, получать определенные смс, отправлять данные на сервер, используя методы post и get, и все работало совершенно нормально.
После перехода на ARM я не понимаю, как ведет себя STM32.
3 ответа
Это не имеет ничего общего с strstr
функция. Вы говорите HAL_UART_Transmit_IT
читать дальше конца массива (строковый литерал) "hello\r\n"
, То, что он найдет, можно догадаться, это неопределенное поведение.
На этой линии:
HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);
Вы говорите, чтобы передать 10 байтов. "hello\r\n"
только 7 байтов + NULL-терминатор, поэтому он также отправляет следующую вещь в память, в этом случае первые 2 байта той другой строки, которую вы используете в strstr
,
Ваш "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
байт.