| особые настройки ttyUSB0 для управления реле |
Вск, 26 Апрель 2009 15:42  |
psionrevo  Сообщений: 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 12:03   |
|
Использовал для "прошивания" atmega самопальный ISP-программатор.
Т.к в ноуте тогда не было serial-порта. Прикупил переходник (аналогичный вашему).
Программатор работает как через эти самые выводы DSR, RTS, DTR, CTS. Все отлично работает через ponyprog и avrdude. Правда скорость переключения оставляет желать лучшего, 1 кб "шьет" несколько минут. Похоже для каждого переключения посылается отдельная usb-команда на каждый бит.
Потом еще для себя написал "утилс" для программного щелканья отдельными выводами. В качестве основы использовал перевод статьи serial howto из местной библы в переводе San-а.
Сейчас на работе нет исходника той "утилсы". Скиньте мыло, я вам зашлю исходник.
Кстати, заметил особенность, что работало это все не всегда стабильно. Заметил, что все это работало только при определенной
последовательности подключения, но при соблюдении последовательности все работало отлично.
|
|
|
| Re: особые настройки ttyUSB0 для управления реле |
Пнд, 27 Апрель 2009 16:31   |
psionrevo  Сообщений: 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 для управления реле |
Втр, 28 Апрель 2009 01:07  |
Mr.Nobody  Сообщений: 917 Зарегистрирован: Ноябрь 2004 Географическое положение: Russia, Moscow |
Старожил guru |

|
|
А на роутере какие-либо действия выполнялись?
И что выводит stty после установки crtscts?
[Обновления: Втр, 28 Апрель 2009 01:24]
|
|
|