2015-01-05 18 views
5

È possibile utilizzare la porta COM su una casella Linux per leggere il valore di un interruttore? Penso che dovrebbe essere possibile con ioctl(), ma ho faticato un po 'a trovare un esempio comparabile. Ho solo bisogno di un input, e ne ho solo bisogno per leggere in un valore HIGH/LOW. Ho pensato che potevo semplicemente usare ioctl per impostare uno dei pin in alto e collegare un interruttore tra quello e un altro pin, usando nuovamente ioctl per leggere il valore del secondo pin()È possibile utilizzare una porta seriale a 9 pin come "GPIO" usando ioctl()?

La logica è che ho un fidato vecchio server in esecuzione nel garage, mi piacerebbe fare qualcosa che desse un segnale e dire se la porta del garage è aperta, dal momento che il server si siede vicino alla porta, ho pensato che sarebbe stato semplice collegare un interruttore nella parte posteriore di la porta com (che è attualmente inutilizzata)

Certo, ho potuto trascorrere qualche chilo, salvare me stesso un mal di testa e utilizzare un Arduino o un ESP8266, ma questo ora mi ha fatto curioso!

+0

Ho amato l'applicazione pratica, 1 ... –

+0

Questa domanda sembra essere fuori argomento, perché si tratta di "Mi chiedo se", invece di uno specifico problema di programmazione. – abelenky

+0

L'ho leggermente riformulato, ho una vera domanda di programmazione – phatmanace

risposta

4

Sì, certo che puoi farlo. Ci sono un certo numero di linee sulla porta seriale che possono essere usate come GPIO. Uno di loro (su pin9 credo) è RING, che viene utilizzato su vecchie modalità seriali per segnalare le chiamate in arrivo.

Si può leggere in questo modo:

unsigned mask = TIOCM_RNG; 
unsigned status; 
int fd; // your serial port file descriptor. 

/* Get current status of the control lines in mask */ 
if (ioctl(fd, TIOCMGET, &status) == -1) { 
    perror("ioctl(TIOCMGET)"); 
} 

/* now evaluate status */ 

È inoltre necessario generare una tensione che è possibile applicare alla linea ad anello. Un modo economico per farlo è quello di trasmettere un flusso di bit alternati. Per esempio. invia 0x55 a qualsiasi velocità di trasmissione.

È quindi possibile toccare la tensione dal pin TX. Dividere le tensioni positive e negative usando due diodi e tamponarli utilizzando due condensatori. Ciò fornirà tensioni positive e negative compatibili con la linea ad anello.

Ecco uno schema che dovrebbe funzionare. Regola i diodi e i condensatori a piacere, ma non impazzire con il condensatore. 10μF dovrebbe essere il massimo.

Generating signal voltages from UART tx-pin

+1

Grazie, sembra molto promettente, farò una prova il giorno successivo o giù di lì, e accetto la risposta se funziona, ho svalutato nel frattempo – phatmanace

+0

la maggior parte della porta seriale tratterà qualsiasi cosa al di sotto di 1V più basso, se i cavi sono corti non c'è bisogno di tensioni negative. – Jasen