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

 
 
> printf(), в чем ошибка?, странное поведение...
Варяг
сообщение Sep 14 2011, 04:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 95
Регистрация: 4-04-11
Из: челябинск
Пользователь №: 64 111



Здравствуйте! есть такая проблема, которую я победил, но интересно, почему она возникла:
передаю по УАРТ строки для GSM модуля. соответственно, первая строка передает номер объекта:

printf ("AT+CMGS=%c%c79517746909%c%c", 34,43,34,13); // эта строка передается нормально и без ошибок

далее надо передать строку сообщения и в конце передать символ возврата каретки 26:

printf ("Save Our Souls!!!%c%c", 26,13); //

но почему-то контроллер периодично передает
Save Our Soul!
Save Our Sou!!
Save Our So!!!
и так далее... но это исправилось повторной передачей символа 26 через 300 мс:

printf ("Save Our Souls!!!%c%c", 26,13);
delay_ms(300);
printf ("%c", 26);
так в чем же может быть проблема, если символы 34,43,34,13 передаются наура?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Sep 14 2011, 06:05
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Варяг @ Sep 14 2011, 07:10) *
так в чем же может быть проблема, если символы 34,43,34,13 передаются наура?
Во-первых <<на "ура">> пишется раздельно.

Во-вторых писать "%c", 13 вместо "\r" как-то совсем уж неприлично.
В-третьих, с кодом символа ваша проблема никак не связана. Вероятно проблема либо в самом коде вывода в UART (передача не дожидаясь готовности, переполнение кольцевого буфера или еще какая-либо программная ошибка), либо у вас не хватает ОЗУ и происходит переполнение стека. Вероятнее первая причина. Не видя кода передачи сказать что-то более определнное сложно. Не зная каким компилятором вы пользуетесь, сколько памяти выделили на стеки, сколько ОЗУ занимает ваша программа и как активно она использует массивы автоматических переменных невозможно отмести и второй вариант. Так что, увы, ошибка где-то на вашей стороне, но сказать где - невозможно без дополнительной информации. Компилятор и функция printf на 99.999% не виноваты.

P.S. Костыли типа передачи символа повтороно вызывают отвращение и тошноту.
Ну и последнее - код возврата каретки ('\r') - 13, код перевода строки ('\n') - 10, код 26 в таблице ASCII означает несколько другое. И использование его внутри строки несколько странно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Варяг
сообщение Sep 14 2011, 09:19
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 95
Регистрация: 4-04-11
Из: челябинск
Пользователь №: 64 111



Цитата(Сергей Борщ @ Sep 14 2011, 09:05) *
Во-первых <<на "ура">> пишется раздельно.

Во-вторых писать "%c", 13 вместо "\r" как-то совсем уж неприлично.
В-третьих, с кодом символа ваша проблема никак не связана. Вероятно проблема либо в самом коде вывода в UART (передача не дожидаясь готовности, переполнение кольцевого буфера или еще какая-либо программная ошибка), либо у вас не хватает ОЗУ и происходит переполнение стека. Вероятнее первая причина. Не видя кода передачи сказать что-то более определнное сложно. Не зная каким компилятором вы пользуетесь, сколько памяти выделили на стеки, сколько ОЗУ занимает ваша программа и как активно она использует массивы автоматических переменных невозможно отмести и второй вариант. Так что, увы, ошибка где-то на вашей стороне, но сказать где - невозможно без дополнительной информации. Компилятор и функция printf на 99.999% не виноваты.

P.S. Костыли типа передачи символа повтороно вызывают отвращение и тошноту.
Ну и последнее - код возврата каретки ('\r') - 13, код перевода строки ('\n') - 10, код 26 в таблице ASCII означает несколько другое. И использование его внутри строки несколько странно.


*Во-первых <<на "ура">> пишется раздельно - пускай.
*писать "%c", 13 вместо "\r" как-то совсем уж неприлично - пишу как мне удобней и наглядней
*вызывают отвращение и тошноту - не нравится не читайте. я проблему решил и мне просто интересно почему она возникла.
*использование 26 символа внутри строки несколько странно - этого требует GSM модуль, а не моя прихоть.

за развернутый ответ спасибо, конечно!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:10
Рейтинг@Mail.ru


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