sigo con problemas manejando 2 puertos rs232

hola!

parece que no termino nunca, resulta que quiero manejar desde un 16f876 2 puertos, en uno tengo conectado un GPS y en otro un Modem GSM

la rutina para capturar datos la tengo tal que así: (utilizo CCS).

#int_rda void serial_isr() { // Interrupción recepción serie USART

// GSM if (kbhit(GSM)) { rcvchar=fgetc(GSM); NuevoCaracterGsm(rcvchar); }

// gps if(kbhit(GPS)){ // Si hay algo pendiente de recibir ... rcvchar=fgetc(GPS); // lo descargo y ... NuevoCaracterGps(rcvchar); // lo añado al buffer }

}

El caso es que del GPS me toma todos los datos, perfectamente, que es el primer define rs232 que he colocado, con lo cual utilizar uart real.

el gsm es virtual por consiguiente y veo que no me toma datos, he revisado pines y demás.

¿alguna idea?.

es el primer programa que hago utilizando 2 puertos serie.

Reply to
Carmelo J. Morales Muñoz
Loading thread data ...

Si no me equivoco, eso es la interrupcion que se genera por la uart y ahí dentro metes el código para leer de la uart y de la otra linea ? Me parece imposible que eso funcione, ni le veo la lógica, pero además me parece imposible que una linea manejada por soft pueda consultarse así if(kbhit()) getchar(); ... ya que eso implica que hay una uart que está trabajando por su cuenta recibiendo caracteres mientras el pic hace otra cosa, pero en el caso de una linea software no es así.

Yo lo que haría sería hacer una sola cosa cada vez, y desactivar las interrpciones, pues solo te van a servir para 'joder' la temporizacion de la linea que se maneja por software. Si calculas los tiempos que se emplean en un bit y en un byte, veras que un pic no es tan rápido como para atender varias tareas a la vez por soft, y menos usando interrpciones.

Si tu programa está formado por un bucle que engloba todo el programa, lo lógico sería dentro de ese bucle comprobar si se recibe algo del telefono, si es así procesarlo, y ya está, no hay que hacer más. Si no se recibe nada del telefono no necesitas ni leer el gps. Si se recibe un peticion de una posicion te vas (entonces si) a leer el gps, montas la respuesta y la trasmites.

Ej: Inicializazacion_general(); while(1){ if(leer_gsm()){ if(es_peticion(){ leer_gps(); generar_respuesta(); transmitir_respuesta(); } if(es_otracosa(){ ......... } } else{ otras_tareas(); } }

Reply to
Nolo Pongo

hola!

ya he puesto otro mensaje sin leer antes el tuyo en el que indico que el problema era de rendimiento del pic respecto a mis rutinas. he subido velocidad a 10mhz y bajado velocidad al puerto sof a 2400 en lugar de 9600. Ahora va, y ciertamente estaba en un error, el segundo puerto por soft hay que estar procesandolo en bucle.

Hay otra pequeña diferencia, mi planteamiento no es leer la posición GPS cuando se haga un RING, sino que cuando se reciba un RING dar la última posición válida drecibida del gps, e spor eso que he puerto en usart al GPS, siempre se está leyendo tramas Nmea y al mismo tiempo verificando que haya un ring del puerto GSM.

Ahora mismo me funciona, solo me falta montar el SMS a enviar.

Por cierto, tengo que terminar el envio del sms con un CONTROL-Z, ¿como envio esa combinazión?, no la conozco

un saludo!>

Reply to
Carmelo J. Morales Muñoz

agenciate la tabla de codigos ascii, de todas formas así a ojo ctrl-a es 1, ctr-b 2, ctrl-c 3, .... ctrl-z (solo tengo dos manos y diez dedos :-))

Reply to
Nolo Pongo

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.