После использования 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 байт.

Другие вопросы по тегам