Interrupciones en linux con C++

Que tal.
Estoy realizando mi tesis de grado, y necesito comunicarme con un periférico (posiblemente un PIC) a través del puerto serie, y más adelante a través del ethernet.
Mi pregunta es como hago para detectar cuando un dato llega al puerto serie, y se active automáticamente una rutina que lea el puerto y analice los datos que llegan. Sucede que una forma seria leer el puerto cada tanto, pero parece medio impractico. Creo que seria mejor si al llegar un dato el puerto lance una interrupción y se active así la rutina. Pero lo debo hacer en linux y no encuentro mucho material al respecto. Más bien no encuentro mucho material acerca del manejo de las interrupciones.
Quiero saber si esta bien ese planteamiento, es decir si esta bien el uso de interrupciones, o si es que ya no se usan. Y tendría que hacerlo mediante en bucle que lea el puerto cada tanto.
Entiendo que tienes experiencia manejando buses de campo, mi tesis radica en hacer una plataforma de software que interprete el protocolo ModBus. Básicamente el periférico que te mencione seria como un gateway pero el análisis del protocolo se haría en la pc, agregando un modulo de control a la plataforma, para cada dispositivo en especifico que se quiera controlar.
Si me puedes dar alguna recomendación, sugerencia o algún ejemplo, tutorial o libro te estaría muy agradecido.

1 respuesta

Respuesta
1
Al nivel de usuario, no puedes utilizar directamente interrupciones con Linux. Tienes que crear un Kernel driver. Y eso lleva su trabajo...
Te aconsejo que consultes el Linux Kernel Hacker Guide. Hay una copia en la pagina "tldp.org/LDP/khg/HyperNews/get/khg.html".
Vete a ver la section sobre los Device Driver.
Hay ejemplos en:
"www.captain.at/programming/rtai/serportint.php"
y
"www.linux.it/~rubini/docs/serial/serial.html"
Suerte.
Gracias por contestarme!.. Ahora le echare un vistazo a los materiales que mencionaste. Espero que me tengas paciencia por que posiblemente este, así como a mucha gente, preguntanto y preguntando.. Quisiera que me aclarases por favor si mi proceder es correcto, es decir por el hecho de tratar de usar interrupciones para esto, o si es que hay algún método más simple de leer en los datos del puerto, me lo hagas saber. Aaa.. Lo que no mencione por cierto es que deseo montarlo en una interfaz gráfica usando QT, si sabes algo de QT también seria genial.
Muchas gracias de nuevo.
Si hay algo que tienes que tener muy claro en la mente es que hacer PULLING es lo peor de lo que se pueda hacer. Es peligroso, consume muchos recursos...
En algunos casos concretos el PULLING es admisible: Si la señal que esperas es síncrona y de duración determinada (y que no tienes nada más que procesar) puedes dedicar tu CPU a dar vueltas en el puerto de entrada.
Tu proyecto es muy orientado multi-tarea: recibes información de differentes nodos que tienes que procesar y que generan acciones... Típicamente tienes que tener una parte encargada de la lectura del puerto que solo se activa a la recepción de un mensaje. Luego tienes que tener uno o varios procesos que se encargan de la análisis de protocolo y de tomar las medidas adecuadas.
Me parece bien que hagas un driver Unix para tu necesidad. No creo que sea muy difícil si manejas el lenguaje C y Google correctamente ;-)
Cuanto a lo de QT (que no conozco bien) te contestaría: Porte utilizar QT cuando hay Java.
Suerte.
Gracias por responder.. De hecho ya empecé aver algunos libros acerca de como crear drivers en linux, están muy interesantes la verdad. Te esare preguntando más en breve. De momento cierro esta pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas