Interrompe a interrupção da porta serial no FreeBSD

1

Eu preciso escrever um programa para reagir às linhas de controle do modem mudando na porta serial da minha máquina FreeBSD 10.3. Eu não quero ler nenhum dado dele (não haverá nenhum). Eu estou ciente que eu posso configurar a porta para aumentar (no meu exemplo) IRQ4 quando isso acontece, mas como meu programa pode pegar a interrupção? Eu tenho que instalar um ponteiro de função na tabela de descritor de interrupção e, em caso afirmativo, como? Ou há algo mais simples que eu possa pegar nas costas?

Por falta de representante, não pude comentar a resposta útil de plonk aqui: Visualização do status da linha (monitoramento) de uma porta serial

Eu fiz algo parecido para uma porta paralela no MS-DOS há algum tempo quando fiz uma leitura digital para minha fresadora, mas pelo que me lembro, estava no modo real e conectado ao IVT, que eu suspeito que seja foram simples em comparação.

(Explicação: herdei um no-break funcional, porém simples, sem porta de comunicação. Imaginei que poderia "ler" os LEDs do painel e o beeper via isolamento elétrico / conversão de nível nas linhas de controle na porta serial do meu servidor. Sobre o no-break da máquina mudar a partir da norma, um script de desligamento será iniciado, Crusty, eu sei, mas se eu conseguir configurá-lo rapidamente, ele me economizará £ 100 em um novo.

    
por Superbead 23.07.2016 / 21:41

1 resposta

1

Como é para um no-break, eu imagino que você pode pagar os sinais do modem a cada 10 segundos ou mais (a partir do freebsd tty (4) ):

int state;
if(ioctl(fd, TIOCMGET, &state)...)
if(state & TIOCM_DTR)...

No entanto, se você deseja ser notificado imediatamente sobre alterações em exatamente um sinal de modem, ou seja, DCD, você pode definir os sinalizadores tty para limpar CLOCAL (veja termios ), e depois open() na porta irá travar até que o sinal de modem DCD esteja ativo. Quando você perder DCD você também terá um SIGHUP.

Outro mecanismo é conectar uma das suas linhas ao pino de entrada de dados RX. Se você puxar essa altura por mais do que o tempo de caractere apropriado para a velocidade que você definiu, isso gerará um erro de enquadramento. Se você configurar IGNBRK = 0 e BRKINT = 0, o driver colocará um byte nulo read() na fila de entrada que pode desbloquear um %code% pendente, se estiver no modo raw.

    
por 24.07.2016 / 15:54