LINUXPORTAL.RU  |   Живое общение LinuxPortal.Ru   |    Ленты событий        |   ФОРУМЫ  |   БИБЛИОТЕКА  |   ССЫЛКИ  |   НОВОСТИ  |   БЛОГИ АДМИНОВ

Участники   Поиск   F.A.Q.    Регистрация    Вход   Начало
Начало » Для администраторов и программистов » Железная разработка » особые настройки ttyUSB0 для управления реле
Показать: Сегодняшние сообщения  :: Показать голосования :: Навигатор по сообщениям
Отправить по e-mail 
Переключение в режим просмотра в виде древовидного списка сообщений и ответов Создать новую тему Отправить ответ
особые настройки ttyUSB0 для управления реле Вск, 26 Апрель 2009 15:42 Переход к следующему сообщения
psionrevo в настоящее время не в онлайне psionrevo  RUSSIAN FEDERATION
Сообщений: 3
Зарегистрирован: Апрель 2009
Новичок
собственно, есть роутер с linux на борту.
пытаюсь на нем построить что-то вроде "умного дома", т.е. с него управлять освещением и т.п.
тем более, что роутер давно используется как оповещатель температуры в частном доме (к нему подключен сотовый и через него с помощью gnokii сбрасываются SMS о температуре, считываемой с метеостанции стоящей в доме, для контроля работы газового котла в мое отсутствие).

к роутеру подключен переходник usb to com (на pl2303 - разобрал китайский кабель dc-510 для сотовых телефонов siemens),
который в системе виден как serial ttyUSB0.

наваял программу:
1)открывает ttyUSB0
2)устанавливает и сбрасывает через ioctl сигналы RTS и DTR.

работает замечательно,т.е. на соответствующих ногах переходника usb to com имеем +3V или 0 (+3V через транзисторный ключ управляет реле).

все бы замечательно, но захотелось через CTS получать информацию с датчика температуры ds1621.

но ioctl(...,TIOCMGET,&ps) никогда в ps не показывает установленного CTS :(((
хотя я проверял работоспособность контакта CTS - устанавливал
adtio.c_flag|=CRTSCTS
замыкал и размыкал CTS с RTS и наблюдал в тестовой программе возобновление чтения данных с ttyUSB0.

т.е. я ожидал напр, что при замыкании CTS и RTS после вызова
ioctl(...,TIOCMGET,&ps)
в ps я увижу установленный TIOCM_CTS - я ошибался.

отсюда делаю вывод - мне нужно правильно настроить
взаимодействие с ttyUSB0.

читал несколько howto, но почему-то там все примеры для ситуации приема-передачи по TX RX.
а мне нужны DTR RTS CTS DSR DCD , а TX не критичен - лишь бы через него могли биты идти - он только для синхронизации нужен.

таким образом, мне нужно:
- управлять DTR и RTS
- посылать через TX байты (DTR, RTS и TX - этих 3х выводов достаточно для управления любым количеством реле)
- считывать CTS, DSR и DCD


ВОПРОС: какие параметры выставить для ttyUSB0
1) при открытии порта

у меня open(..., O_RDWR|O_NOCTTY)

2) при настройке порта

у меня
memset(&adtio,0,sizeof(adtio));
adtio.c_cflag &=~PARENB;
adtio.c_cflag &=~CSTOPB;
adtio.c_cflag &=~CSIZE;
adtio.c_cflag |=CS8;
adtio.c_cflag |=CREAD;
adtio.c_cflag &=~HUPCL;
adtio.c_cflag |=CLOCAL;
cfsetispeed(&adtio,115200);
cfsetospeed(&adtio,115200);
adtio.c_lflag=0;
adtio.c_iflag=IGNBRK|IGNPAR;
adtio.c_oflag &=~OPOST;
adtio.c_cc[VTIME]=10;
adtio.c_cc[VMIN]=0;


спасибо за любые идеи и ссылки!

[Обновления: Вск, 26 Апрель 2009 15:51]

Re: особые настройки ttyUSB0 для управления реле Пнд, 27 Апрель 2009 01:39 Переход к предыдущему сообщенияПереход к следующему сообщения
San АНДРЕЕВ в настоящее время не в онлайне San АНДРЕЕВ  RUSSIAN FEDERATION
Сообщений: 8512
Зарегистрирован: Июнь 2002
Географическое положение: Санкт-Петербу...

administrator · partner

"матёрый человечище" (c)

Простите, не удержался от выражения восторга. :)
Re: особые настройки ttyUSB0 для управления реле Пнд, 27 Апрель 2009 08:10 Переход к предыдущему сообщенияПереход к следующему сообщения
Mr.Nobody  RUSSIAN FEDERATION
Сообщений: 917
Зарегистрирован: Ноябрь 2004
Географическое положение: Russia, Moscow
Старожил
guru

Цитата:


т.е. я ожидал напр, что при замыкании CTS и RTS после вызова
ioctl(...,TIOCMGET,&ps)
в ps я увижу установленный TIOCM_CTS - я ошибался.



Правильно ли я понял - делается сначала adtio.c_flag|=CRTSCTS, а потом TIOCMSET, а потом TIOCMGET?

[Обновления: Пнд, 27 Апрель 2009 08:21]

Re: особые настройки ttyUSB0 для управления реле Пнд, 27 Апрель 2009 12:03 Переход к предыдущему сообщенияПереход к следующему сообщения
Андрей в настоящее время не в онлайне Андрей  RUSSIAN FEDERATION
Сообщений: 576
Зарегистрирован: Май 2003
Географическое положение: Россия, Москв...
Старожил

Использовал для "прошивания" atmega самопальный ISP-программатор.
Т.к в ноуте тогда не было serial-порта. Прикупил переходник (аналогичный вашему).
Программатор работает как через эти самые выводы DSR, RTS, DTR, CTS. Все отлично работает через ponyprog и avrdude. Правда скорость переключения оставляет желать лучшего, 1 кб "шьет" несколько минут. Похоже для каждого переключения посылается отдельная usb-команда на каждый бит.
Потом еще для себя написал "утилс" для программного щелканья отдельными выводами. В качестве основы использовал перевод статьи serial howto из местной библы в переводе San-а.

Сейчас на работе нет исходника той "утилсы". Скиньте мыло, я вам зашлю исходник.

Кстати, заметил особенность, что работало это все не всегда стабильно. Заметил, что все это работало только при определенной
последовательности подключения, но при соблюдении последовательности все работало отлично.
Re: особые настройки ttyUSB0 для управления реле Пнд, 27 Апрель 2009 16:31 Переход к предыдущему сообщенияПереход к следующему сообщения
psionrevo в настоящее время не в онлайне psionrevo  RUSSIAN FEDERATION
Сообщений: 3
Зарегистрирован: Апрель 2009
Новичок
Mr.Nobody писал(а) Пнд, 27 Апрель 2009 08:10


Правильно ли я понял - делается сначала adtio.c_flag|=CRTSCTS, а потом TIOCMSET, а потом TIOCMGET?



исправляюсь - вот куски кода:

кусок из main
  int le,li,lcom,ps;

  if ((le=opencom(argv[1],&lcom))!=0){
    printf("Error %i when open com port %s",le,argv[1]);
    return le;
  } 
  li=0;
  le=0;
// очистим DTR
ioctl(lcom, TIOCMGET, &ps);
ps &= ~TIOCM_DTR;
ioctl(lcom, TIOCMSET, &ps);  
//в цикле то устанавливаю, то сбрасываю RTS чтобы видно было что в ps он меняется
  
  while  (le++ < 1000000) {
    ioctl(lcom, TIOCMGET, &ps);	
    if (le % 2000 == 0) {
     li=1-li;
     if (li==1) { ps &= ~TIOCM_RTS;} else  {ps |= TIOCM_RTS;}
     ioctl(lcom, TIOCMSET, &ps);	
    }   
    printf("\n %i ", ps);	
    if ((ps & TIOCM_CTS)>0) {printf("CTS");}
  }
  close(lcom);
  printf("\n Test completed \n");


int opencom(char *device, int *lcom){
	struct termios adtio;
	if ((*lcom = open(device, O_RDWR| O_NOCTTY)) < 0) {return 1;}
	if ( flock(*lcom, LOCK_EX) < 0 ) {return 2;}
	memset(&adtio, 0, sizeof(adtio));
	adtio.c_cflag &= ~PARENB;      // No parity
	adtio.c_cflag &= ~CSTOPB;      // One stop bit
	adtio.c_cflag &= ~CSIZE;       // Character size mask
	adtio.c_cflag |= CS8;          // Character size 8 bits
	adtio.c_cflag |= CREAD;        // Enable Receiver
	adtio.c_cflag &= ~HUPCL;       // No "hangup"
	adtio.c_cflag |= CLOCAL;       // Ignore modem control lines
	cfsetispeed(&adtio, 115200);
	cfsetospeed(&adtio, 115200);	
	adtio.c_lflag = 0;
	adtio.c_oflag &= ~OPOST;
	adtio.c_iflag = IGNBRK|IGNPAR;
	adtio.c_cc[VTIME] = 10;		// timer 1s
	adtio.c_cc[VMIN] = 0;		// blocking read until 1 char
	if (tcsetattr(*lcom, TCSANOW, &adtio) < 0) {return 3;}
	tcflush(*lcom, TCIOFLUSH);
	return 0;
}


вот запускаю этот код и вижу на выводе что-то типа
4
4
4
.....
0
0
0
....
4
4

т.е. видим изменение сигнала RTS.
даже если замкну cts и rts ничего в выводе не меняется.
причем тестером vмежду землей и rts ловлю то 3V то 0
(между землей и cts 5v).


когда же я в процедуре opencom ставлю
adtio.c_flag|=CRTSCTS
и еще делаю в главном цикле вывод байта на TX,
происходит следущее:
на консоль не выводится значение ps пока я не замкну cts и rts.
когда перестаю замыкать - вывод продолжается.

из чего я и сделал вывод, что CTS исправен,
а моя проблема в том, что я не знаю как правильно настроить
ttyUSB0 с одной стороны (и, возможно, pl2303 с другой).

[Обновления: Пнд, 27 Апрель 2009 17:01]

Re: особые настройки ttyUSB0 для управления реле Пнд, 27 Апрель 2009 17:09 Переход к предыдущему сообщенияПереход к следующему сообщения
psionrevo в настоящее время не в онлайне psionrevo  RUSSIAN FEDERATION
Сообщений: 3
Зарегистрирован: Апрель 2009
Новичок
Андрей писал(а) Пнд, 27 Апрель 2009 12:03


Потом еще для себя написал "утилс" для программного щелканья отдельными выводами. В качестве основы использовал перевод статьи serial howto из местной библы в переводе San-а.
Сейчас на работе нет исходника той "утилсы". Скиньте мыло, я вам зашлю исходник.



спасибо!
psionrevo собака mail ru (и в личку скинул)
Re: особые настройки ttyUSB0 для управления реле Втр, 28 Апрель 2009 01:07 Переход к предыдущему сообщения
Mr.Nobody  RUSSIAN FEDERATION
Сообщений: 917
Зарегистрирован: Ноябрь 2004
Географическое положение: Russia, Moscow
Старожил
guru

А на роутере какие-либо действия выполнялись?

И что выводит stty после установки crtscts?

[Обновления: Втр, 28 Апрель 2009 01:24]

  Переключение в режим просмотра в виде древовидного списка сообщений и ответов Создать новую тему Отправить ответ
Предыдущая тема:Linux GeneralTouch driver usb + serial
Следующая тема:Сегфолты после cpufreq-set -g powersave
Переход к форуму:
  

-=] Вернуться вверх [=-
[ Сформировать XML ] [ RSS ]

Текущее время: Птн Сен 10 08:59:39 MSD 2010
.:: Обратная связь :: Начало ::.

При поддержке: FUDforum 3.0.0.
Copyright © 2001-2009 FUDforum Bulletin Board Software

©"Linuxportal.Ru". Материалы сайта можно использовать свободно при условии сохранения этой свободы при дальнейшем распространении, если явно не указано иное.

Дизайн и программирование: ,
Поставьте нашу кнопку: Linux Portal.ru ::: Линукс Портал.ру