Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: программно сделать Break линии сом порта на нужное количество миллисекунд  (Прочитано 663 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн santore

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
в программе, перед выдачей байта в сом порт, нужно сбросить линию на 50 мс, как это написать, в minicom проверил - break работает,  slep() дает задержку в секундах, delay не работает, есть ли возможность в ubuntu подключать <dos.h>
можно ли воспользоваться и как это прописать
int tcsendbreak(int fildes, int duration)

Оффлайн staso

  • Активист
  • *
  • Сообщений: 437
    • Просмотр профиля
Очень давно не программировал, но может натолкнет на решение.

Когда нужно было решать подобные задачи использовал флаги и прерывания.
Алгоритм -
перед критичным участком выставляем флаг (в регистре например) и включаем обработчик прерываний.
Затем в цикле мониторим состояние флага. (Соответственно он должен измениться в обработчике прерывания)
По сработке прерываем цикл и продолжаем выполнение кода далее.
Это реализовывалось еще на 8 разрядных процах. Более чем уверен что аналогичные (либо более развитые) вещи наличествуют и в нынешних "камнях"
ИМХО.

Оффлайн santore

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
спасибо за совет, но хочу без прерываний обойтись

Оффлайн staso

  • Активист
  • *
  • Сообщений: 437
    • Просмотр профиля
Я и не настаиваю. )
Просто хотелось бы понять как можно организовать задержку иначе.?
Думается мне что любом подключаемом модуле с функцией корретируемой задержки так или иначе будет реализовано именно это.
Что еще может предложить железо? ЯП ведь не более чем транслятор "хотелок" программиста на уровень железа.
Или я не прав?

Оффлайн santore

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
задержку в принципе циклом можно организовать, больше сброс линии интересует, что-то типа по аналогии
IOCTL_SERIAL_SET_BREAK_ON         
IOCTL_SERIAL_SET_BREAK_OFF

проблему решил, может кому пригодится
tcsendbreak(fd, 0) -дает сброс линии на 250 мс
tcsendbreak(fd, 1) -дает сброс линии на 100 мс

сбросить линию на нужное количество мс удалось с помощью:
#include <sys/ioctl.h>
ioctl(fd, TIOCSBRK, 0);  //сброс линии в ноль
usleep(50000);           //задержка 50 мс
ioctl(fd, TIOCCBRK, 0);  //установить линию в единицу
« Последнее редактирование: 26 Июня 2015, 19:02:15 от santore »

 

Страница сгенерирована за 0.016 секунд. Запросов: 19.