Я пробовал 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()
.
Заранее спасибо.
Какова длина строки согласно strlen()
? Если перед байтами OK
есть нулевой байт, то strstr()
не найдет OK
- он остановится на первом нулевом байте.
Нет, он содержит 0x0A и 0x0D. Общий ответ при отладке выглядит следующим образом: A T 0x0D 0x0A 0x0D 0x0A O K 0x0D 0x0A. шестнадцатеричные - это \r
и \n
.
Ты включил string.h
?
Да, я включил string.h
if (strstr((char*)buff + 6,"OK"))
"работает"?
В этом случае некоторая информация, которую вы предоставляете, неверна. Как вы проверяете содержимое буфера, чтобы утверждать, что в нем нет нулей?
Кстати, вы говорите, что buff[9]
- это \0
, но в приведенном выше комментарии это 0x0A
.
Или. Red_Blink
просто не работает.
попробуйте if (strstr ((char *) buff, "OK")) Green_Blink (1000); , и проверьте, мигает ли зеленый светодиод? может быть проблема с красным светодиодом?
Интересно ... Green_Blink
вообще возвращается? Или просто мертвая петля?
Я использовал определенную пользователем функцию strstr()
, теперь она работает. Как это вообще возможно ??
"Как это вообще возможно?" "Это" что?
Да, все светодиоды в порядке, я мигаю ими перед входом в цикл while
strstr()
из string.h
не дает правильного вывода, но пока я использовал код robomart.com/blog/user-defined-function-strstr из этой ссылки. Все работает нормально.
Вот это да. Никогда не используйте ничего с этой страницы. Код ужасен.
Я бы посоветовал посмотреть, что у вас в буфере до символов 6 и 7
Я предсказываю, что бафф не закончится нулем
Пожалуйста, проверьте вопрос, я редактировал весь вопрос, так как этот вопрос даже не помог другим
Пожалуйста, не меняйте свой вопрос на совершенно новый, особенно если он приводит к аннулированию существующего ответа.
Сурав: Если вы редактируете новый вопрос поверх старого из-за того, что ваш вопрос был заблокирован, то напишите мне на @halfer
, и я найду ресурсы, которые помогут вам разблокировать вашу учетную запись.
Судя по вашим наблюдениям и анализу, buff
действительно содержит OK
по смещению 6
и заканчивается нулем по смещению 9.
Если strstr
не находит OK
в buff
, возможное объяснение состоит в том, что buff
может содержать другой нулевой ограничитель перед смещением 6, а OK
не присутствует перед этим нулевым ограничителем.
buff
инициализируется всеми битами 0, поэтому любой элемент, который не изменяется, является нулевым ограничителем. Возможно ли, что HAL_UART_Receive_IT
сохранит нулевые байты в buff
? нулевые байты иногда используются в качестве заполнения при последовательной передаче.
Также возможно, что функция библиотеки C strstr
не работает на вашей целевой платформе. Однажды у меня была серия необъяснимых ошибок из-за неисправных строковых функций на встроенных платформах ST с их набором инструментов.
Не хотел бы отрицательный голос объяснить?
Вы все еще волнуетесь? Некоторые люди получают гораздо больше удовольствия от DV, чем от УФ. Конечно, ваш ответ правильный, и бафф должен содержит ноль перед символом O
. BTW OP имеет аппаратный отладчик, встроенный в его плату, и его можно отсортировать за 30 секунд - этого достаточно, чтобы навести курсор на бафф при отладке.
@P__J__: если только библиотека C strstr
не работает, что вполне возможно с учетом цели.
strstr
очень хорошо работает во всех известных мне наборах инструментов ARM на основе gcc. Поэтому очень маловероятно, что strstr
не сработает. Я занимаюсь программированием на ARM uC в течение многих лет и не нашел ни одной неисправной реализации strstr
. Кстати, я увел.
@P__J__: как я уже сказал, однажды это случилось со мной на встроенной платформе ST с их набором инструментов на основе gcc. Это могло быть вызвано поддельной конфигурацией, но было очень неприятно осознавать причину проблемы: использование нестандартных замен для strcpy
и strcat
устранило проблему.
Видя опубликованный код (и никаких попыток отладки) я больше подозреваю, что перезаписанный strstr
работает просто случайно :), и только в этом случае
@P__J__: Я согласен с тем, что код с robomart.com ужасен, без отступов, имеет внутреннее имя функции, использует NULL
для '\0'
и совершенно неверен для strstr("", "")
, но, похоже, работает для случая OP.
Пожалуйста, проверьте вопрос, я редактировал весь вопрос, так как этот вопрос даже не помог другим
Комментарий от @sourav теперь устарел, так как он относится к вопросу, который заменяется совершенно новым. Мы не допускаем этого здесь, поэтому он был отменен.
Что там нули перед 6 и 7?