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

 
 
 
Reply to this topicStart new topic
> 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
demiurg_spb
сообщение Sep 14 2011, 04:45
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 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");



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 14 2011, 06:05
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #4


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

Группа: Участник
Сообщений: 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
Палыч
сообщение Sep 14 2011, 10:03
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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);
Go to the top of the page
 
+Quote Post
Варяг
сообщение Sep 14 2011, 11:23
Сообщение #6


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

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



Цитата(Палыч @ Sep 14 2011, 13:03) *
Почему нет реакции на символ <Сtrl/Z> (код символа 26)? Может быть, потому, что за ним не должен следовать символ с кодом 13 ("\r") ?


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

забыл... похожая последовательность (сначала символ 26 потом 13) действует без проблем когда передается сообщение через GPRS (принцип передачи такой же как в предыдущем случае)

Сообщение отредактировал Варяг - Sep 14 2011, 11:32
Go to the top of the page
 
+Quote Post

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

 


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


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