Primero hay que entender como funciona la llegada de los mensajes SMS.
Para eso está el comando AT-CNMI:
AT+CNMI: New Message indication to TE
Tiene cinco parámetros y si bien no entiendo bien todos ellos, puedo decirte que con los primeros 2 configuras la accion que va a tomar el SIM cuando llegue un mensaje nuevo.
El primer parámetro dice los siguiente:
<mode>:
0: buffer in TA;
1: discard indication and reject new SMs when TE-TA link is reserved; otherwise forwarddirectly;
2: buffer new Sms when TE-TA link is reserved and flush them to TE after reservation; otherwise forward directly to the TE;
3: forward directly to TE;
Creo que TE refiere al terminal Serie del SIM900. Entonces poniendo el código 2 o 3 como primer parámetro va a hacer que al llegar un nuevo mensaje, se transmita al puerto serie (que vos estás monitoreando) tal cual como llega. En el caso del 2 hay alguna consideracion, pero no vale la pena explicarlo creo.
El segundo parámetro dice:
<mt>:
0: no SMS-DELIVER are routed to TE;
1: +CMTI: <mem>,<index> routed to TE;
2: for all SMS_DELIVERs except class 2: +CMT: .... routed to TE;
class 2 is indicated as in <mt>=1;
3: Class 3: as in <mt>=2;
other classes: As in <mt>=1;
No entiendo bien que es Class 2 o 3, pero poniendo el valor 2 o 3 como segundo parámetro va a hacer que se te envíe "+CMT: "SM", 1....." al puerto serie.
Entonces si o si, en la configuracion del modem ni bien lo encendes tenes que ejecutar 2 comandos:
AT + CMGF = 1
AT+CNMI=2,2,0,0,0
sin esto nada te va a funcionar como corresponde.
Luego tenes que nota que hay 2 tipos de mensajes que el SIM900 te va a dar por el puerto serie.
Un tipo es la respuesta a un comando que vos mandaste y que generalmente es OK o ERROR. Este tipo de respuesta lo vas a esperar siempre despues de enviar un comando al SIM900. De cierta forma es sincrònico con tu aplicacion, vos mandas un mensaje y enseguida esperas la respuesta.
El otro tipo de mensaje es asincrónico y puede llegar en cualqueir momento. Es la llegada de un nuevo mensaje. Esos datos que va arecivir el puerto serie van a llegar en culquier momento.
Otro tema es el fin de línea del SIM900. Al poner el terminal en la PC en modo HEX, yo veo que cuando el módulo manda OK en realidad manda OK + 13 + 10 (en decimal) que corresponedn a CR y LF o '\n' y '\r'. O sea que el final de cada línea de mensjae del SIM está determinado por esos 2 caracteres.
Bueno, ahora yo para arrancar no usaría interrupcion para el puerto serie. Porque usar interrupcion te obliga a llevar buffer's, analizarlos despues, resetearlos, etc.
Yo usaría las funciones de CCS que te permitan leer de a 1 línea completa, creo que gets es la funcion en CCS.
Entonces en las primeras lineas del codigo configuraría el SIM enviando los dos comandos que te comenté arriba y despues de cada uno de esos comandos leería una línea del puerto serie y verificaría si reciví OK o ERROR.
Por ejemplo
respuesta[100];
mensaje[100];
puts("AT + CMGF = 1\n") o printf o lo que uses para sacar datos por el puerto serie
respuesta=gets()
if(respuesta[0]=='O' && respuesta[1]== 'K')
puts("AT+CNMI=2,2,0,0,0\n") o printf o lo que uses para sacar datos por el puerto serie
respuesta=gets()
if(respuesta[0]=='O' && respuesta[1]== 'K')
respuesta=gets() // Acá el programa se va a quedar clavado esperando una línea en el puerto serie
if(respuesta[0]=='+' && respuesta[1]== 'C'... 'M' ..... 'T')
//Reciví un mensaje, en la siguiente línea del puerto serie viene el mensaje
mensaje=gets();
if(mensaje[0]=='#' && respuesta[1]== 'A'... '0')
// si el mensaje enviado es #A0 apago la salida A0
............
............
else
error
bueno, esa es la idea... hay que pasarla a código CCS... si lo vas haciendo y probando avisanos y lo revisamos.
Saludos