Autor Tema: Comunicacion serie  (Leído 1627 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado em2401

  • PIC10
  • *
  • Mensajes: 7
Comunicacion serie
« en: 11 de Noviembre de 2013, 05:23:24 »
Soy algo nuevo en los pic, mas que todo en la parte de la comunicación serie. me propuse realizar un proyecto interesante en el cual quiero controlar un carro RF por bluetooth desde un celular Android. Por motivos de tiempo no podre realizar una aplicacion para android pero por suerte encontré esta: Google play
Lo unico que necesito es la lectura de los acelerometros del celular para usarlo como control, según el programa este los envía así:
--------------------------------------------------------------------------------------------------------------
Los datos se envían como una matriz de caracteres, de acuerdo con la norma
aXbYcZd en la que:
X = accel_X
Y = accel_Y
Z = accel_Z
Los valores que figuran en las direcciones X, Y y Z son números enteros. Para capturarlos en el código de Arduino, debe formar cadenas de todos los caracteres entre el carácter 'a' y el carácter 'b' y los convierte al formato de número entero a trabajar normalmente.
--------------------------------------------------------------------------------------------------------------

Mi pregunta es, si todo eso lo envía como una cadena, como puedo separarlo para obtener X, Y y Z. Investigando vi un codigo que quizás servirme para esto:
Código: [Seleccionar]
#int_rda
rda_isr()
{  
dato=getc();
if(dato=='a') X=getc();
else if(dato=='b') Y=getc();
else if(dato=='c') Z=getc();
}

Lo que no me queda claro es si al entrar a la parte de "X=getc();" en X se almacenaran todos los caracteres restantes (osea "XbYcZd") hasta que termine el envió de datos saltándose así el IF donde comprueba el carácter "b", si es asi tendria que indicarle que al llegar una "b" empiece a guarda en "Y=getc();"
Espero que me puedan ayudar, busque lo mas que pude, pero por desconocimiento en el tema no se como realizar una búsqueda mas especifica hacia mi problema.
PD: utilizo el pic 16f877A y pienso adquirir el modulo bluetooth esclavo HC-06.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Comunicacion serie
« Respuesta #1 en: 11 de Noviembre de 2013, 09:35:33 »
  Yo no utilizo CCS como compilador, pero guiándome por el nombre diría que getc() sólo lee un caracter. Por lo tanto si el valor de X enviado es "125" (cadena de caracteres), sólo te quedarás con el "1".

  Deberías colocar un ciclo do-while para sólo capturar los valores hasta encontrar "b" en el caso de querer capturar X, o encontrar
"c" en el caso de capturar Y o encontrar "d" en el caso de capturar Z
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Comunicacion serie
« Respuesta #2 en: 11 de Noviembre de 2013, 22:40:14 »
em2401, el codigo que colocas en principio se ve bien; pero eso dependera del resto del codigo que hallas escrito  :mrgreen:
Si por ejemplo recibes una 'a' tu programa almacenara el siguiente valor en 'X' y saldra de la interrupcion de alli ira al programa principal y si suponte al regresar de la interrupcion llegas a un delay_ms(500) y llega un dato el programa no saltara directamente a la interrupcion sino que esperara a que termine el delay para luego saltar a la interrupcion. Como consecuencia de ello abras perdido posiblemennte varios datos.  :shock:
Por eso si piensas utilizar una interrupcion por recepcion de datos podrias; si los datos obedecen al formato que colocastes (aXbYcZd), modificarlo un poco, de forma tal que al recibir la 'a' guarde los siguientes tres bytes de tu interes X, Y y Z y la 'd' utilizarla para indicarle al programa que ya fueron enviados los bytes necesarios y salgas de la interrupcion o simplemte salir de esta al recibir el tercer byte de dato valido o sea Z.  :D

Saludos

Desconectado em2401

  • PIC10
  • *
  • Mensajes: 7
Re: Comunicacion serie
« Respuesta #3 en: 11 de Noviembre de 2013, 23:16:35 »
  Yo no utilizo CCS como compilador, pero guiándome por el nombre diría que getc() sólo lee un caracter. Por lo tanto si el valor de X enviado es "125" (cadena de caracteres), sólo te quedarás con el "1".

  Deberías colocar un ciclo do-while para sólo capturar los valores hasta encontrar "b" en el caso de querer capturar X, o encontrar
"c" en el caso de capturar Y o encontrar "d" en el caso de capturar Z
Como hago para almacenar uan cadena de caracteres? tengo que crear una variable tipo "char X[]" he ir guardando los datos ahi?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Comunicacion serie
« Respuesta #4 en: 11 de Noviembre de 2013, 23:19:35 »
  Yo no utilizo CCS como compilador, pero guiándome por el nombre diría que getc() sólo lee un caracter. Por lo tanto si el valor de X enviado es "125" (cadena de caracteres), sólo te quedarás con el "1".

  Deberías colocar un ciclo do-while para sólo capturar los valores hasta encontrar "b" en el caso de querer capturar X, o encontrar
"c" en el caso de capturar Y o encontrar "d" en el caso de capturar Z
Como hago para almacenar uan cadena de caracteres? tengo que crear una variable tipo "char X[]" he ir guardando los datos ahi?

  Sí, exacto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas