Strstr не может найти подстроку, но буфер содержит значение

Я пробовал UART, используя STM32F407V6T6 и CubeMx.

Мой UART работает нормально. Проблема, с которой я сталкиваюсь при сравнении буфера: я использую strstr(), чтобы проверить, содержит ли мой буфер допустимую подстроку или нет.

Вот код:

uint8_t buff[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);

    __HAL_UART_ENABLE_IT(&huart2, UART_IT_TC);
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    HAL_Delay(1000);

    while (1) {
        HAL_UART_Transmit_IT(&huart2, (uint8_t *)"AT\r\n", 5);
        Orange_Blink(100);
        HAL_Delay(1000);
        HAL_UART_Receive_IT(&huart2, buff, 10);
        buff[9] = '\0';
        if (buff[6] == 'O' && buff[7] == 'K') {
            Green_Blink(1000);    //Blinks
        }
        if (strstr((char*)buff, "OK")) {
            Red_Blink(1000);      //Doesn't blink
        }
        Clear_Buffer((char*)buff);
    }
}

Вот что я делаю: подключаю свой GSM Module Sim800 и отправляю AT. После отладки кода я обнаружил, что buff[6] = 'O' и buff[7] = 'K'. И пока проверял, что мог мигать светодиодом.

        if (buff[6] == 'O' && buff[7] == 'K') {
            Green_Blink(1000);    //Blinks
        }

Но когда я пробую функцию strstr(), она ничего не возвращает.

        if (strstr((char*)buff, "OK")) {
            Red_Blink(1000);   //RED LED DOENS'T Blink
        }

Сначала я подумал, что мой массив buff не заканчивается на \0. Так я сделал это

     buff[9] = '\0';

Но ничего не изменилось.

Любые предложения, почему он не работает с strstr().

Заранее спасибо.

Что там нули перед 6 и 7?

Eugene Sh. 13.08.2018 21:10

Какова длина строки согласно strlen()? Если перед байтами OK есть нулевой байт, то strstr() не найдет OK - он остановится на первом нулевом байте.

Jonathan Leffler 13.08.2018 21:14

Нет, он содержит 0x0A и 0x0D. Общий ответ при отладке выглядит следующим образом: A T 0x0D 0x0A 0x0D 0x0A O K 0x0D 0x0A. шестнадцатеричные - это \r и \n.

sourav maity 13.08.2018 21:15

Ты включил string.h?

Eugene Sh. 13.08.2018 21:16

Да, я включил string.h

sourav maity 13.08.2018 21:18

if (strstr((char*)buff + 6,"OK")) "работает"?

chux - Reinstate Monica 13.08.2018 21:19

В этом случае некоторая информация, которую вы предоставляете, неверна. Как вы проверяете содержимое буфера, чтобы утверждать, что в нем нет нулей?

Eugene Sh. 13.08.2018 21:19

Кстати, вы говорите, что buff[9] - это \0, но в приведенном выше комментарии это 0x0A.

Eugene Sh. 13.08.2018 21:20

Или. Red_Blink просто не работает.

Eugene Sh. 13.08.2018 21:24

попробуйте if (strstr ((char *) buff, "OK")) Green_Blink (1000); , и проверьте, мигает ли зеленый светодиод? может быть проблема с красным светодиодом?

Nick S 13.08.2018 21:31

Интересно ... Green_Blink вообще возвращается? Или просто мертвая петля?

Eugene Sh. 13.08.2018 21:33

Я использовал определенную пользователем функцию strstr(), теперь она работает. Как это вообще возможно ??

sourav maity 13.08.2018 21:35

"Как это вообще возможно?" "Это" что?

alk 13.08.2018 21:36

Да, все светодиоды в порядке, я мигаю ими перед входом в цикл while

sourav maity 13.08.2018 21:36
strstr() из string.h не дает правильного вывода, но пока я использовал код robomart.com/blog/user-defined-function-strstr из этой ссылки. Все работает нормально.
sourav maity 13.08.2018 21:38

Вот это да. Никогда не используйте ничего с этой страницы. Код ужасен.

Eugene Sh. 13.08.2018 21:41

Я бы посоветовал посмотреть, что у вас в буфере до символов 6 и 7

0___________ 13.08.2018 22:09

Я предсказываю, что бафф не закончится нулем

bruceg 13.08.2018 23:01

Пожалуйста, проверьте вопрос, я редактировал весь вопрос, так как этот вопрос даже не помог другим

sourav maity 14.08.2018 14:48

Пожалуйста, не меняйте свой вопрос на совершенно новый, особенно если он приводит к аннулированию существующего ответа.

Michael Dodd 14.08.2018 16:47

Сурав: Если вы редактируете новый вопрос поверх старого из-за того, что ваш вопрос был заблокирован, то напишите мне на @halfer, и я найду ресурсы, которые помогут вам разблокировать вашу учетную запись.

halfer 14.08.2018 16:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
21
595
1

Ответы 1

Судя по вашим наблюдениям и анализу, buff действительно содержит OK по смещению 6 и заканчивается нулем по смещению 9.

Если strstr не находит OK в buff, возможное объяснение состоит в том, что buff может содержать другой нулевой ограничитель перед смещением 6, а OK не присутствует перед этим нулевым ограничителем.

buff инициализируется всеми битами 0, поэтому любой элемент, который не изменяется, является нулевым ограничителем. Возможно ли, что HAL_UART_Receive_IT сохранит нулевые байты в buff? нулевые байты иногда используются в качестве заполнения при последовательной передаче.

Также возможно, что функция библиотеки C strstr не работает на вашей целевой платформе. Однажды у меня была серия необъяснимых ошибок из-за неисправных строковых функций на встроенных платформах ST с их набором инструментов.

Не хотел бы отрицательный голос объяснить?

chqrlie 13.08.2018 23:43

Вы все еще волнуетесь? Некоторые люди получают гораздо больше удовольствия от DV, чем от УФ. Конечно, ваш ответ правильный, и бафф должен содержит ноль перед символом O. BTW OP имеет аппаратный отладчик, встроенный в его плату, и его можно отсортировать за 30 секунд - этого достаточно, чтобы навести курсор на бафф при отладке.

0___________ 13.08.2018 23:46

@P__J__: если только библиотека C strstr не работает, что вполне возможно с учетом цели.

chqrlie 13.08.2018 23:48
strstr очень хорошо работает во всех известных мне наборах инструментов ARM на основе gcc. Поэтому очень маловероятно, что strstr не сработает. Я занимаюсь программированием на ARM uC в течение многих лет и не нашел ни одной неисправной реализации strstr. Кстати, я увел.
0___________ 13.08.2018 23:52

@P__J__: как я уже сказал, однажды это случилось со мной на встроенной платформе ST с их набором инструментов на основе gcc. Это могло быть вызвано поддельной конфигурацией, но было очень неприятно осознавать причину проблемы: использование нестандартных замен для strcpy и strcat устранило проблему.

chqrlie 13.08.2018 23:54

Видя опубликованный код (и никаких попыток отладки) я больше подозреваю, что перезаписанный strstr работает просто случайно :), и только в этом случае

0___________ 13.08.2018 23:56

@P__J__: Я согласен с тем, что код с robomart.com ужасен, без отступов, имеет внутреннее имя функции, использует NULL для '\0' и совершенно неверен для strstr("", ""), но, похоже, работает для случая OP.

chqrlie 13.08.2018 23:59

Пожалуйста, проверьте вопрос, я редактировал весь вопрос, так как этот вопрос даже не помог другим

sourav maity 14.08.2018 14:48

Комментарий от @sourav теперь устарел, так как он относится к вопросу, который заменяется совершенно новым. Мы не допускаем этого здесь, поэтому он был отменен.

halfer 14.08.2018 16:50

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