Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: Lenbinary en 21 de Septiembre de 2009, 08:09:50
Título: Comunicación entre dos pc's por puerto serie
Publicado por: Lenbinary en 21 de Septiembre de 2009, 08:09:50
Buenas a todo el mundo. Estoy inmerso en el desarrollo de un sistema que debe controlar un sistema de micromecanizado a través del puerto serie.
Estoy buscando un código que me permita establecer una conexión a través del puerto serie en C/C++. He estado leyendo algunos foros y la verdad es que no he avanzado mucho. Casi todos los códigos están obsoletos y no funcionan en WinXP. Os comento un poco que es lo que estoy intentando hacer.
Me hace falta familiarizarme con las funciones y la manera de transmitir que me permite WinXP. De momento me conformo con un programa en plan servidor y otro cliente. El cliente solo debe abrír el puerto serie de su equipo, configurarlo y recibir los caracteres que el envie el servidor. El servidor abrirá el puerto serie, lo configurará, enviará los caracteres y cuando termine cerrará su puerto y dará por finalizada la conexión.
El problema es que todos los códigos que encuentro son muy antiguos y ninguno me funciona en WinXP. ¿Alguien puede ayudarme? Con un enlace a una web donde me expliquen más o menos las funciones que usa la API de WinXP y tal me conformo.
Estoy usando Build C++ como entorno de programación.
Muchas gracias de antemano
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: fabianjsm en 21 de Septiembre de 2009, 15:11:22
Fijate este link, dentro del foro www.todopic.com.ar/foros/index.php?topic=25264.msg226084#msg226084 (http://www.todopic.com.ar/foros/index.php?topic=25264.msg226084#msg226084) El codigo es para C++ sobre windows, por eso el include <windos.h>, prove en mingw con DevC++ y Build C++ sin problemas. Si tenes que hacer otras cosas mientras esperas recibir algo, podes utilizar threads. Espero que te sirva, cualquier cosa nos decis.
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: Lenbinary en 22 de Septiembre de 2009, 04:10:48
Muchas gracias por tu aporte voy a ver que tal se me da hoy la mañana y si consigo realizar la conexión entre pc´s
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: Lenbinary en 22 de Septiembre de 2009, 08:42:25
fabianjm tengo una duda a ver si puedes respondermela. He estado modificando el código para realizar un servidor de envio y un programa en modo escucha. Mi duda mi duda me surge al probar el ejecutable.
Ejecuto la primera vez el código y se envia el string perfectamente y me vuelve a salir el menú de captura. El problema es que ahora la captura no me funciona.
Con un código que encontré en este foro me pasaba una cosa parecida pero no llegaba a enviarse ni la primera cadena de caracteres. Estoy usando siempre el mismo descriptor del dispositivo, pero no se porque ocurre esto. La verdad es que no me he parado mucho a mirarlo, pero como me pasó el otro día también no se si es que debería reiniciar el puerto cada vez que envio.
Me voy a explicar un poco. Si yo cierro la consola y vuelvo a abrir el puerto funciona de nuevo, por lo que no se si debo cerrar el puerto cuando termine la transmisión y volver a abrirlo cuando desee enviar otra vez. No creo que tenga mucho sentido, ya que se me queda bloqueado en el bucle de captura o eso creo. Porque también puede ser que el sistema se quede bloqueado en de recepción.
Del código que me enviaste solo he modificado que en vez de enviar un caracter, adquiero un string por teclado y lo envio caracter a caracter.
Si eso luego te subo el código, que lo tengo en otro PC.
Muchas gracias de antemano
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: fabianjsm en 22 de Septiembre de 2009, 10:53:24
Puede ser que estes esperando un evento que nunca ocurrirá. Cuando seteas la variable de eventos con SetCommMask podrias considerar ademas la posibilidad de que ocurra un error (algo asi como mascara_de_eventos = EV_ERR | EV_BREAK | EV_RXCHAR | otros_eventos;). Suele ocurrir por ejemplo que mientras esperas un EV_RXCHAR ocurre un error y el EV_RXCHAR nunca te llega, pero te llegará un EV_ERR si lo estas esperando. Sobre la posibilidad de que se haya quedado colgado en el bucle de recepcion, puede ser, la llamada a WaitCommEvent bloquea el proceso (o el hilo si fuera el caso) y solo le retorna el control cuando ocurre el evento indicado en la mascara.
Espero poder ayudarte.
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: Lenbinary en 23 de Septiembre de 2009, 06:21:33
Buenos días, aunque allí será de noche todavía. Ya he corregido el error. Llevabas razón en que el problema es que no llegaban los eventos, pero como lo que quiero es una aplicación de comunicación de uno que envia y otro escucha todo lo que llega, me he cargado el hilo de recepción, que es donde se quedaba esperando a que el otro equipo envie.
Se que me estoy aprovechando mucho de tus conocimientos y no aporto mucho, pero aún así me gustaría hacerte una pregunta. Nunca he programado con hilos (aunque debería). ¿Conoces algún manual o guía de referencia para gente que no sepa apenas nada de hilos? Es que aunque esta aplicación no me hace falta, porque lo que estoy es cogiendo soltura con la comunicación serie (las funciones y todo eso), estoy seguro que cuando quiera realizar un programa que comunique el pc con el sistema de control del micromecanizado, lo más seguro es que tenga que realizar una programación por hilos.
Muchas gracias por todo
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: fabianjsm en 24 de Septiembre de 2009, 04:30:38
Mis conocimientos son básicos :oops:, ademas acá aprendemos juntos! El thread es en C/C++ una funcion como las demas. Para crearlo se utiliza CreateThread de la API de Windows.
CreateThread(0, 0, &hilo, 0, 0, 0);
Donde &hilo es el punero a la funcion que estaria definida de esta forma:
El thread comparte todo con el proceso: archivos, memoria de codigo, datos, pila, etc. Si tenes por ejemplo una variable publica, pueden acceder a ella tanto el proceso como el hilo creado por este (con el primer argumento de CreateThread se puede establecer los atributos de seguridad para que este acceso sea limitado). Para que el hilo sea una funcion como las demas, incluso en su declaracion y definicion, podes hacer un cast a LPTHREAD_START_ROUTINE (definido en windows.h):
Código: C++
int hilo(constchar*s){printf("%s\n", s);}
int main()
{
HANDLE h = CreateThread(0, 0,
(LPTHREAD_START_ROUTINE)&hilo,
(void*)"Hola, mundo!\n", 0, 0);
WaitForSingleObject(h, INFINITE);
return0;
}
También esta CreateRemoteThread, con el cual podemos crear un thread en el area de memoria otro proceso si conocemos su handle (y si ademas no esta protegido). Una buena ayuda sobre thread's, y todo lo que sea windows: MSDN. Adjunto los ejemplos.
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: Lenbinary en 24 de Septiembre de 2009, 07:17:16
Muchas gracias de nuevo.
Acabo de venir de probar el código en la máquina que debe controlar pero no comunica. En principio, por el hyperminal si funciona bien mandandole las mismas lineas de comando que mi código envia entre los dos pc's pero en la conexión del hyperterminal, el control de flujo se usa hardware y en mi aplicación no le indico el tipo de control de flujo. ¿Como se configura?
No enitendo como entre los dos ordenadores se comunican perfectamente y entre el pc y el controlador no. A ver que si corregirlo antes de comer.
Muchas gracias
Título: Re: Comunicación entre dos pc's por puerto serie
Publicado por: fabianjsm en 24 de Septiembre de 2009, 07:46:27
Estas usando control de flujo por hardware? Recuerda que para eso necesitas las lineas de control, no solo Tx y Rx. El control de flujo se setea en la estructura DCB que le pasas a SetCommState. Para desabilitar todo control de flujo deberias poner a FALSE los campos dcb.fOutX, dcb.fInX, dcb.fOutxCtsFlow y dcb.fOutxDsrFlow. Ademas dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE;