|
Работа со строкой., STM32F103 |
|
|
|
Nov 18 2013, 07:47
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Я принимаю строку с терминала. Знак принятия строки - возврат каретки (клавиша ENTER), который я отбрасываю. CODE void ParseString(char *str) { //split command and argument from string - space separated char *command; char *argument; command = strtok(str," "); argument = strtok(NULL," "); UsartSendInt(strlen(argument)); // for debug if(strcmp(command,"test")==0) { if(strlen(argument) == 0) { UsartSendString("No argument\r"); } else { UsartSendString("There is an argument\r"); } } }
Если я ввожу, скажем, ”test 100 ” все работает как надо - я вижу ответ - There is an argument. Если я ввожу только ”test” - я попадаю туда же. Чтобы понять, где проблема я вывожу длину аргумента на терминал. Получается что даже если аргумент пустой длина аргумента - 2. Код 2 There is an argument. В чем проблема? В AVR все работало как надо. Еще добавлю - я работаю в IAR.
Сообщение отредактировал Jenya7 - Nov 18 2013, 07:49
|
|
|
|
|
 |
Ответов
|
Nov 18 2013, 12:05
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 26-10-05
Пользователь №: 10 125

|
Цитата(kovigor @ Nov 18 2013, 17:37)  Вы можете оставить все, как есть, и в причинах проблемы не разбираться. Это ваше дело. Но разумнее было бы ее все же изучить ... По моему причина ясна. Автор топика используя функцию strtok получал нулевой указатель и пытался вычислить по нему длину строки. Реализация strlen для AVR похоже учитывала это и возвращала 0, или как вариант по адресу 0 находился 0. Для кортекса непрокатило. Можно проверить посмотрев в отладчике, что лежит по нулевому, первому, второму адресу.
|
|
|
|
|
Nov 18 2013, 15:30
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 26-10-05
Пользователь №: 10 125

|
Цитата(kovigor @ Nov 18 2013, 18:22)  Объясните тогда, откуда берутся посторонние символы. При вызове UsartSendString(argument) с параметров в виде указателя на нулевой адрес, функция 1. считает длину строки (ищет от начального адреса байт ==0x0). В данном случае, скорее всего, начиная с адреса 0x0 там лежат байты: 0xB8 0x07 0x00. Итого имеем длину строки ==2, что и получал автор при вызове strlen(argument) 2. Выдает эти первые два байта в уарт (т.е. 0xB8 0x07) и добавляет символ перевода каретки 0x0D. То что UsartSendString добавляет перевод строки видно из первого посста автора (вывод UsartSendInt(strlen(argument)) идет в отдельной строке). В итоге имеем в терминале B8 07 0D.
|
|
|
|
Сообщений в этой теме
Jenya7 Работа со строкой. Nov 18 2013, 07:47 kovigor Цитата(Jenya7 @ Nov 18 2013, 11:47) Я при... Nov 18 2013, 08:28 Fedor [quote name='Jenya7' date='Nov 18 2013... Nov 18 2013, 08:47 Jenya7 Цитата(Fedor @ Nov 18 2013, 13:47) strlen... Nov 18 2013, 09:36  Fedor Цитата(Jenya7 @ Nov 18 2013, 15:36) А как... Nov 18 2013, 09:57  kovigor Цитата(Jenya7 @ Nov 18 2013, 13:36) B8 07... Nov 18 2013, 10:10    Jenya7 Цитата(kovigor @ Nov 18 2013, 16:37) AVR ... Nov 18 2013, 12:01     Jenya7 Цитата(Fedor @ Nov 18 2013, 17:05) По мое... Nov 18 2013, 12:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|