|
|
  |
printf(), в чем ошибка?, странное поведение... |
|
|
|
Sep 14 2011, 04:10
|

Частый гость
 
Группа: Участник
Сообщений: 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 передаются наура?
|
|
|
|
|
Sep 14 2011, 04:45
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Обычно функция вывода символа определяется таким образом, чтобы она сама предваряла символ '\n' символом '\r'. Код int fputc(int c, FILE* stream) { if ((char)c=='\n') { if (!fputc('\r', stream)) { return (0); } }
uart_put_byte(c);
return (c); } Благодаря чему становится возможным писать так: Код puts("Save Our Souls!!!"); или так: Код printf("Save Our Souls!!!\n");
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 14 2011, 06:05
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Sep 14 2011, 09:19
|

Частый гость
 
Группа: Участник
Сообщений: 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 модуль, а не моя прихоть. за развернутый ответ спасибо, конечно!
|
|
|
|
|
Sep 14 2011, 10:03
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Варяг @ Sep 14 2011, 08:10)  так в чем же может быть проблема...? Первую строку можно без проблем передавать так: Код printf ("AT+CMGS=\"+79517746909\"\r"); Почему нет реакции на символ <Сtrl/Z> (код символа 26)? Может быть, потому, что за ним не должен следовать символ с кодом 13 ("\r") ? Код printf ("Save Our Souls!!!%c", 26);
|
|
|
|
|
Sep 14 2011, 11:23
|

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

|
Цитата(Палыч @ Sep 14 2011, 13:03)  Почему нет реакции на символ <Сtrl/Z> (код символа 26)? Может быть, потому, что за ним не должен следовать символ с кодом 13 ("\r") ? Да, точно, скорее всего из за этого. Благодарствую! забыл... похожая последовательность (сначала символ 26 потом 13) действует без проблем когда передается сообщение через GPRS (принцип передачи такой же как в предыдущем случае)
Сообщение отредактировал Варяг - Sep 14 2011, 11:32
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|