Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как перенаправить стандартный поток stdout в com порт  (Прочитано 11599 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
zuuuuk
Постоялец

ru
Offline Offline

« : 01-10-2009 18:01 » 

Доброго времени суток.

Я применяю в программе функции printf, puts.
Они выводят данные на консоль linux.
Не хочется переписывать программу.

Возможно ли так настроить систему, чтобы она выводила эти данные в com порт?
« Последнее редактирование: 01-10-2009 18:34 от Sel » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 01-10-2009 19:34 » new

У меня сейчас нет под рукой уже давно com порта. Но все устройства в Linux проецируются в файловую систему /dev. Теперь тебе только останется написать скриптик обертку для твоей программы.
Код:
#! /bin/bash
com=/dev/com1       # Тут я не знаю, как устройство будет спроецировано. Будем считать, что так.
if [ -c $com ]; then    # проверяем, что устройство спроецировано
   program > $com     # Ну собственно само перенаправление
else
  echo "Устройство не спроецировано";
fi
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #2 : 02-10-2009 04:33 » 

Вот в том то и дело, что мне надо обойтись бес скрипта.
я хотелбы в самом ночале программы изменить настройки системы,
что бы все остальные printf И puts,в этой программе, посылали данные в нужный com порт.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 02-10-2009 07:06 » 

Тогда нужно переназначить поток вывода. Ведь он, по сути, ничем не отличается от других потоков. Не уверен, что решение в лоб 100% рабочее и правильное, но копать нужно, полагаю именно в данном направлении:
Код:
fclose (stdout);
stdout = open (...); // нужно открыть поток вывода в ком-порт
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 03-10-2009 08:10 » 

Лучше сделать так, чтобы гарантированно занять дескриптор 1 (особенно если заменить надо еще дескрипторы 0 и 2):

Код:
int fd;

/* Открываем символьное устройство COM-порта. */
fd = open("/dev/ttyS0", O_RDWR);

/* Здесь должна быть настройка порта. */

/* Закрываем потоки stdin, stdout, stderr и привязанные к ним файлы. */
fclose(stdout);
fclose(stdin);
fclose(stderr);

/* Дублируем дескриптор fd на место 0, 1 и 2. */
dup(fd, 0);
dup(fd, 1);
dup(fd, 2);

/* Закрываем его за ненадобностью. */
close(fd);

/* Создаем потоки. */
stdin = fdopen(0, "r");
stdout = fdopen(1, "w");
stderr = fdopen(2, "w");
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines