|
|
  |
Работа со строкой., 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, 08:28
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Jenya7 @ Nov 18 2013, 11:47)  Я принимаю строку с терминала. А вы передатчик этого порта соедините с приемником другого порта той же машины (если в ней два порта) или же соедините этот передатчик с приемником другой машины. Потом на этой, приемной, машине запустите терминалку, которая позволяет отображать HEX - коды, а не ASCII - символы. Это умеет делать, например, терминалка, входящая в состав среды разработки CodeVision. Так вы узнаете, что реально принимает ваш МК. Для справки. При нажатии "ENTER" в порт почти наверняка уходит два символа, а не один - "Возврат каретки" (0x0d) и "Перевод строки" (0x0a). Еще дополнение. Код пробела - 0x20. Как его интерпретирует ваша функция - тоже вопрос ...
|
|
|
|
|
Nov 18 2013, 08:47
|
Участник

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

|
[quote name='Jenya7' date='Nov 18 2013, 13:47' post='1211386'] Я принимаю строку с терминала. Знак принятия строки - возврат каретки (клавиша ENTER), который я отбрасываю.
strlen может и не проверять указатель на 0. В этом случае если в 0x0-0x01 адресе лежат символы то получите как раз 2. Я бы препочел все же проверять сам argument на 0.
|
|
|
|
|
Nov 18 2013, 09:36
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Fedor @ Nov 18 2013, 13:47)  strlen может и не проверять указатель на 0. В этом случае если в 0x0-0x01 адресе лежат символы то получите как раз 2. Я бы препочел все же проверять сам argument на 0. Я заменил UsartSendString("There is an argument\r"); на UsartSendString(argument); Получаю B8 07 0D. B8 07 - это какой то мусор а 0D - взврат каретки, не знаю откуда он взялся, может терминал его добавляет. А как проверить аргумент на 0?
|
|
|
|
|
Nov 18 2013, 09:57
|
Участник

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

|
Цитата(Jenya7 @ Nov 18 2013, 15:36)  А как проверить аргумент на 0? Код if( argument == NULL ){ UsartSendString(" Argument is empty\r"); }
|
|
|
|
|
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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|