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

 
 
> Как использовать printf для вывода сразу на несколько устройств?
scout
сообщение Jun 16 2006, 19:31
Сообщение #1


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

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Понимаю, что нужно создать несколько функций:


print_LCD // вывод на LCD
{

}

print_RS232
{

}

и в каждой перенаправить printf на соответствующий putchar. Подскажите как это сделать?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aaron
сообщение Apr 20 2012, 06:52
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



подниму старую тему, быстрым поиском по форуму решил, что эта тема наиболее подходящая для вопроса.
Раньше обходился простым вызовом printf, а сейчас появилось желание использовать разделение потока: fpintf(stdout, ...) и fprintf(stderr, ...)
Функции вполне себе стандартные, в конечном счёте всё сводится к вызову fputs(pStr, pStream). Если поток stdout, я использую класс и асинхронные очереди сообщений (неблокирующая передача). Если поток stderr, то передаю сообщение напрямую в UART полностью без прерываний:
Код
signed int fputs(const char *pStr, FILE *pStream) {
    signed int num = 0;
    if (pStream == stdout) {
        console_uart.puts(pStr);
    } else if (pStream == stderr) {
        NVIC_DisableIRQ(USART1_IRQn);
        while (*pStr != 0) {
            USART1_SendData(*pStr);
            num++;
            pStr++;
        }
        NVIC_EnableIRQ(USART1_IRQn);
    } else {
        num = -1;
    };
    return num;
}

signed int fprintf(FILE *pStream, const char *pFormat, ...) {
    va_list ap;
    signed int result;

    // Forward call to vfprintf
    va_start(ap, pFormat);
    result = vfprintf(pStream, pFormat, ap);
    va_end(ap);

    return result;
}

signed int printf(const char *pFormat, ...) {
    va_list ap;
    signed int result;

    // Forward call to vprintf
    va_start(ap, pFormat);
    result = vprintf(pFormat, ap);
    va_end(ap);

    return result;
}

Суть в том, что все вызовы функции printf(...) всегда работают нормально (используется stdout).
Но функция fprintf(pStream, ...) может либо нормально отработать, либо привести к зависанию МК, независимо от используемого pStream.
Например, такой вызов приведёт к зависанию на fprintf:
printf("line 1\r\n");
fprintf(stdout, "line 2\r\n");
А такой вызов всё отработает нормально:
printf("line 1\r\n");
for (i=0;i<5;i++) fprintf(stdout, "line %г\r\n", i);

Начал копать, - зависание происходит на fputs. Я вообще не понимаю, как такое возможно, ведь printf и fprintf в итоге используют одну и ту же функцию fputs, почему тогда она в одном случае зависает???
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 20 2012, 10:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Aaron @ Apr 20 2012, 10:52) *
Начал копать, - зависание происходит на fputs.

В примере fputs должен без вариантов вызвать console_uart.puts. Так в каком именно месте происходит "зависание"?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 20 2012, 11:01
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я подозреваю, что вывод в stderr прерывает работу прерывания (каламбурчик!) в какой-то неудачный момент времени, и после возобновления передачи по прерываниям система раскорячивается. Попробуйте запрещать прерывания поаккуратнее, скажем, после запрета - дождитесь флага TXEMPTY, и очистите его. Ну и при последующем разрешении - если есть данные в буфере передатчика, то надо взвести TXEMPTY снова, или что-то в этом роде.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- scout   Как использовать printf для вывода сразу на несколько устройств?   Jun 16 2006, 19:31
- - zltigo   printf() оставьте в покое. Ознакомьтесь с первоист...   Jun 16 2006, 19:44
- - scout   Спасибо за ответ. В общем понятно. Но неясно что т...   Jun 16 2006, 20:06
|- - zltigo   Цитата(scout @ Jun 16 2006, 23:06) Спасиб...   Jun 16 2006, 20:09
- - scout   Спасибо вам zltigo. Все получилось.   Jun 16 2006, 20:47
- - VAI   Я вывожу или на термопринтер или на LCD. В putchar...   Jun 17 2006, 04:05
- - scout   Спасибо VAI тоже вариант, только меня немного смущ...   Jun 17 2006, 17:43
- - VAI   не настолько она стандартная. Я не имею ввиду симв...   Jun 19 2006, 03:36
|- - jcxz   Странный и, по-моему, очень кривой метод. Во-первы...   Apr 20 2012, 08:14
- - Aaron   весь код пишу сам, прекрасно представляю, что он д...   Apr 20 2012, 09:39


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

 


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


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