реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа со строкой., STM32F103
Jenya7
сообщение Nov 18 2013, 07:47
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 18 2013, 08:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Jenya7 @ Nov 18 2013, 11:47) *
Я принимаю строку с терминала.

А вы передатчик этого порта соедините с приемником другого порта той же машины (если в ней два порта) или же соедините этот передатчик с приемником другой машины. Потом на этой, приемной, машине запустите терминалку, которая позволяет отображать HEX - коды, а не ASCII - символы. Это умеет делать, например, терминалка, входящая в состав среды разработки CodeVision. Так вы узнаете, что реально принимает ваш МК.
Для справки. При нажатии "ENTER" в порт почти наверняка уходит два символа, а не один - "Возврат каретки" (0x0d) и "Перевод строки" (0x0a). Еще дополнение. Код пробела - 0x20. Как его интерпретирует ваша функция - тоже вопрос ...
Go to the top of the page
 
+Quote Post
Fedor
сообщение Nov 18 2013, 08:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 18 2013, 09:36
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 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?
Go to the top of the page
 
+Quote Post
Fedor
сообщение Nov 18 2013, 09:57
Сообщение #5


Участник
*

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



Цитата(Jenya7 @ Nov 18 2013, 15:36) *
А как проверить аргумент на 0?



Код
if( argument == NULL ){
   UsartSendString(" Argument is empty\r");
}
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 18 2013, 10:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Jenya7 @ Nov 18 2013, 13:36) *
B8 07 - это какой то мусор

Вот, начните с выяснения того, что это за мусор и откуда он берется. Все эти функции, строки на Си и проч. здесь принципиально ни при чем и помочь никак не смогут. Ничего лишнего терминалка не передает. У вас скорости на порту для машины и МК совпадают ?
Опять, же, для справки: 0x07 - это спец. символ звонка. Просто так, ниоткуда, он не появляется sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 18 2013, 11:13
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Да - argument == NULL решает проблему. Я думаю что проблема в - char *argument. Динамическая алокация это всегда гемморой.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 18 2013, 11:19
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Jenya7 @ Nov 18 2013, 14:13) *
Я думаю что проблема в - char *argument. Динамическая алокация это всегда гемморой.

Нет. Проблема в том, что вы не понимаете, что принимает ваш МК и откуда это берется. Все остальные проблемы глубоко вторичны ...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 18 2013, 11:26
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(kovigor @ Nov 18 2013, 16:19) *
Нет. Проблема в том, что вы не понимаете, что принимает ваш МК и откуда это берется. Все остальные проблемы глубоко вторичны ...

Я работаю с этим терминалом давно. На AVR никаких проблем не возникало - что ввел то он послал.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 18 2013, 11:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Jenya7 @ Nov 18 2013, 14:26) *
Я работаю с этим терминалом давно. На AVR никаких проблем не возникало - что ввел то он послал.

AVR - не показатель. Еще раз. Здесь добавляется приемник на другом МК. Если, например, на портах машины и МК не совпадают скорости, будет приниматься мусор. Вы можете оставить все, как есть, и в причинах проблемы не разбираться. Это ваше дело. Но разумнее было бы ее все же изучить ...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 18 2013, 12:01
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(kovigor @ Nov 18 2013, 16:37) *
AVR - не показатель. Еще раз. Здесь добавляется приемник на другом МК. Если, например, на портах машины и МК не совпадают скорости, будет приниматься мусор. Вы можете оставить все, как есть, и в причинах проблемы не разбираться. Это ваше дело. Но разумнее было бы ее все же изучить ...

Попробую поставить еще один МК. Хотелось бы докопаться до корня проблемы.
Go to the top of the page
 
+Quote Post
Fedor
сообщение Nov 18 2013, 12:05
Сообщение #12


Участник
*

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



Цитата(kovigor @ Nov 18 2013, 17:37) *
Вы можете оставить все, как есть, и в причинах проблемы не разбираться. Это ваше дело. Но разумнее было бы ее все же изучить ...

По моему причина ясна. Автор топика используя функцию strtok получал нулевой указатель и пытался вычислить по нему длину строки. Реализация strlen для AVR похоже учитывала это и возвращала 0, или как вариант по адресу 0 находился 0. Для кортекса непрокатило. Можно проверить посмотрев в отладчике, что лежит по нулевому, первому, второму адресу.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 18 2013, 12:22
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Fedor @ Nov 18 2013, 15:05) *
По моему причина ясна.

Объясните тогда, откуда берутся посторонние символы.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 18 2013, 12:39
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Fedor @ Nov 18 2013, 17:05) *
По моему причина ясна. Автор топика используя функцию strtok получал нулевой указатель и пытался вычислить по нему длину строки. Реализация strlen для AVR похоже учитывала это и возвращала 0, или как вариант по адресу 0 находился 0. Для кортекса непрокатило. Можно проверить посмотрев в отладчике, что лежит по нулевому, первому, второму адресу.


Я тоже так думаю. А символы - это налезание на какой нибудь левый адрес(я так думаю).
Go to the top of the page
 
+Quote Post
Fedor
сообщение Nov 18 2013, 15:30
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016