Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: printf(), в чем ошибка?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Варяг
Здравствуйте! есть такая проблема, которую я победил, но интересно, почему она возникла:
передаю по УАРТ строки для 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 передаются наура?
demiurg_spb
Обычно функция вывода символа определяется таким образом, чтобы она сама предваряла символ '\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");

Сергей Борщ
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 означает несколько другое. И использование его внутри строки несколько странно.
Варяг
Цитата(Сергей Борщ @ 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, 08:10) *
так в чем же может быть проблема...?

Первую строку можно без проблем передавать так:
Код
printf ("AT+CMGS=\"+79517746909\"\r");

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


Да, точно, скорее всего из за этого. Благодарствую!

забыл... похожая последовательность (сначала символ 26 потом 13) действует без проблем когда передается сообщение через GPRS (принцип передачи такой же как в предыдущем случае)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.