PDA

Ver la versión completa : Puerto serie en Linux



smaug_
07-06-2007, 15:50
Hola chicos, a ver, tengo una pequeña duda. Se puede acceder a la vez a un puerto serie? Os explico, tengo un lector de codigos de barra y necesito que dos programas lean a la vez el codigo que se pase. He hecho un pequeño programita de prueba, y lo ejecuto, funciona a la perfeccion, pero al ejecutarlo en otro terminal, no lee. Tengase en cuenta que estoy ejecutando los dos a la vez. Asi que mi pregunta es, si estoy haciendo algo mal ala hora de acceder al puerto serie o dos procesos no pueden acceder a la vez al puerto serie. Si es el segundo caso, como podria interceptar lo que ocurra con el lector?

El codigo del programa es el siguiente:


//zona de includes

#define RESTART "\x45" //Señal de activacion del lector
#define PUERTO "/dev/ttyS1" // Puerto serie

main(){
int scand; //descriptor
if((scand=open(PUERTO,O_RDWR))==-1){
printf("No se pudo abrir el puerto");
exit(-1);
}
while(1){
read(scand
}

}

No me da tiempo a terminar el codigo, luego os lo pego.

Giskard
07-06-2007, 21:29
No me da tiempo a terminar el codigo, luego os lo pego.

:p :p Ya decía yo que tu porgrama no hacía muchas cosas

Lo más probable es que no se pueda acceder al puerto con 2 programas al mismo tiempo, creo que debido a que es un puerto de entrada/salida, habría mucha corrupción de datos y se mezclaría la información. Lo cual generaría un caos en el puerto.

Mi recomendación es que programes una especie de demonio que se conecte al puerto serie y tenga el control de éste. Y así los programas ya no tendrían que comunicarse con el puerto sino con el demonio.

Saludos

j8k6f4v9j
08-06-2007, 13:14
│ Setserial contains the ability to save your current serial ↑
│ configurations, but you have to decide the method which setserial is to ▮
│ use. ▒
│ ▒
│ autosave once - this saves your serial configuration the first time you ▒
│ select this option, using kernel information. From this point on this ▒
│ information is never changed automatically again. If you want the ▒
│ configuration to change you have to edit serial.conf by hand. This is ▒
│ the default and is good in almost all cases. ▒
│ ▒
│ manual - control serial.conf yourself right from the start. Good for ▒
│ experts who like to get their hands dirty, but autosave-once is probably ▒
│ still better. ▒
│ autosave always - save the serial configuration on every system ▒
│ shutdown, and reload the saved state when you reboot. Good if you change ▒
│ your serial configuration a lot, but DANGEROUS as rebooting a system ▒
│ with "errors" can result in the complete loss of your serial ▒
│ configuration! ▒
│ ▒
│ kernel - blank the serial.conf file and use the kernel settings on ▒
│ bootup. This may be useful for standard situations or where setserial ▮
│ has become confused. ↓


│ <Aceptar>

Quizá ese programita te venga bien.

El siguiente código terminado puede ayudarte a ver más claro cómo manejar los puertos serie bajo GNU/linux:

http://www.ontrak.net/linux.htm

Salu2



http://img359.imageshack.us/img359/6631/celliigy4.pngKeep on Rollin' :mad:

smaug_
20-06-2007, 14:29
Aun sigo con el tema del puerto serie. Tal como decia Giskard no he podido hacer que los dos programas lean a la vez del puerto serie. No hace falta siquiera el codigo en c, ya que haciendo dos cat, uno captura lo que entra pero el otro se queda a la espera.
Pense en hacerlo mediante tuberias, renombre el dispositivo /dev/ttyS1 a /dev/ttyS100 y cree una tuberia con el nombre /dev/ttyS1 para engañar al programa. Luego mediante un :


# cat /dev/ttyS100 > /dev/ttyS1

Para redirigir la salida , el cat seria sustituido si funciona, mas tarde por un programa que se encargara de enviarlo a los dos programs finales. Pero no funciono tampoco, ya que el programa no conseguia leer la informacion de la tuberia. Aparte, necesitaria una tuberia de doble sentido, ya que tendria que ser de escritura y lectura, y por lo que se, no se puede (corregidme si me equivoco).
Por ultimo, alguien me comento sobre pseudoterminales, las pty, pero llevo un dia buscando info y no encuentro mucho al respecto de como hacerlo. Asi que se que no es habitual, pero alguien me pasa un howto de como conectar un pseudoterminal con un dispositivo serie?? Y si se podria asi que los dos programas leyeran los mismos datos, uno del dispositivo y otro del pseudoterminal??

Un saludo y gracias!