Есть такая задача: надо написать прогу, которая могла бы выводить напряжение на com-порт(не важно какое, просто сколько-нить вольт). Буду блпгодарен если кто поможет с этим!!!
Тебе какая-то конкретная нога нужна или любая? Если любая, то тычь вольтметром в порт, но напрямую, а не через шнурок: шнурки, как правило, имеют 4 провода: GND, передача, приём и запрос на передачу. Поэтому для наблюдения через шнурок можно написать, кажется, так:
мне не важно на какие контакты выводить. прогсто надо чтобы в исходном положении напряжения не было, а после запуска проги появилось, причем на тот период времени, пока прога работает!!!
void readlpt()
{
int i,sock;
unsigned int tempbt=0, bt;
.
.
.
ioperm(0x378,10,1);
outb(32,0x37a);
while(1){
sleep(1);
bt =~((inb(0x379)<<5)&0xF00)+inb(0x378);
if(tempbt!=bt ) printtable(tempbt=bt);
}
sqlite3_close(log_db);
exit(0);
}
Эта функция читает из LPT порта сототояние 12 ножек. Но если заменить inb на outb то мы сможем писать в порт. Только в BOIS параметер LPT должен быть что то топа SPP/EPP (тут точно не помню). Если не найдешь инфу то я подниму старые доки.
ioperm(0x378,10,1); Это ты получаешь право на запись в порт.
outb(32,0x37a); Кажется установка режима LPT (точно уже не помню). Хотя нет вру. Этим кажется ты переводишь порты которые для вывода в режим в вода. Значит тебе это пропустить.
outb(ЧИСЛО,0x378) за место числа в водишь что тебе нужно. У lpt восемь "стандартный" вывода. Просто содовая нужную маску ты включаешь нужный контакт.
Сейчас нет возможности проверить, но на Линуксе должно работать:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
void com_rts_set(int *stop)
{
int fd, status_rts, init_status;
fd = open("//dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);// открыть порт
ioctl(fd, TIOCMGET, &(init_status)); // запросить состояние порта
status_rts = init_status | TIOCM_RTS; // состояние с установленным RTS
ioctl(fd, TIOCMSET, &(status_rts)); // установить это состояние
while(!(*stop)){sleep(1);} // твоё условие работы
ioctl(fd, TIOCMSET, &(init_status)); // вернуть изначальное состояние
close(fd); // закрыть порт
}
я как-то баловался подобным - писал мордочку для тестирования самосборного устройства (в будущем програматора ПЗУ) - в итоге появилась глупенькая программка на сях которая читает и пишет в LPT - причем довольно удобная, если многого от неё не хотеть...
получилось! если копировать на /dev/ttyS0 какой-нить текстовый файл, то на 4(DTR) и 7 контактах появляется напряжение 12 вольт. Круто, всем спасибо за помощь.
> поделись, буду благодарен
http://slil.ru/23566618
там есть README, но если вкратце то:
- распаковываешь, переходишь в директорию
- меняешь в файле pioui.c в строке "#define PORT 0x378" адрес порта
0x378 на тот что используется у тебя (чаще всего это как раз 0x378)
- меняешь в файле pioui.c строки "inport_empty.c" и "outport_empty.c"
на соответственно "linux/inport.c" и "linux/outport.c" (нужно для
реальной работы, иначе это просто эмуляция)
- компилируешь (команда make)
- запускаешь ./pioui
- на экране видишь три региста представленные побитно с обозначением
выводов на разъеме
- управление такое: D+Enter,S+Enter,C+Enter - соответственно для ввода
байта в регистр данных, состояния или управления (байт вводить следует
побитно, например "00001111"). R+Enter - для чтения из всех регистров. Q+Enter - выход.
для работы понадобится текстовая консоль размером 80х25 (именно так)
з.ы.: это чудо я написал после прочтения половины первой главы K&R - поэтому просьба смеяться не громко :)))
Удачи!