#include <16F873A.h>
#device adc=10
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7))
#include <LCD420.C>
int ch;
char cadena[30];
int1 flag=0;
#int_rda
void serial_isr()
{
cadena=gets;
flag=1;
}
void main()
{
int16 q;
float p;
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
enable_interrupts(global);
enable_interrupts(int_rda);
lcd_init();
enable_interrupts(global);
enable_interrupts(int_rda);
set_adc_channel(0); //Habilitación canal0
while(true)
{
delay_us(10);
q = read_adc(); //Lectura canal0
p = 5.0 * (float)q / 1024.0; //Conversión a tensión
printf(lcd_putc, "\fADC = %4ld", q);
printf(lcd_putc, "\nVoltage = %01.2fV", p);
delay_ms(100);
printf("\fADC = %4ld \r", q);
printf("Voltage = %01.2fV", p);
if(flag)
{
printf("Recibido = %c", ch);
printf(lcd_putc, "\fANDUVO = %c", ch);
delay_ms(100);
flag=0;
}
}
}
Gracias gente, voy a probar aumentar la longitud de la cadena.
Ahora me surge una duda, si yo declaro una cadena de tipo CHAR cada elemento de la cadena deberia ser de tipo char, siendo asi, cuando yo reciba la trama ASCII no deberia ser un char por caracter ascii ??? si no es asi tengo un error de concepto importante
Gracias gente, voy a probar aumentar la longitud de la cadena.
Ahora me surge una duda, si yo declaro una cadena de tipo CHAR cada elemento de la cadena deberia ser de tipo char, siendo asi, cuando yo reciba la trama ASCII no deberia ser un char por caracter ascii ??? si no es asi tengo un error de concepto importante
Gracias gente, voy a probar aumentar la longitud de la cadena.
Ahora me surge una duda, si yo declaro una cadena de tipo CHAR cada elemento de la cadena deberia ser de tipo char, siendo asi, cuando yo reciba la trama ASCII no deberia ser un char por caracter ascii ??? si no es asi tengo un error de concepto importante
un tipo char es realmente un entero de 8 bits, en cuanto a lo que comentas, tienes razon, cuando recibes una cadena, cada elemento es del tipo char, sin embargo, para una cadena de caracteres siempre necesitas un espacio mas debido a que las cadenas al final siempre tiene un 0
es decir, si tu cadena es "123" para cada caracter en representado en ascci tienes su número de la siguiente forma
0x31 0x32 0x33 0x00
como ves, al final tienes un 0x00, el cual no se ve cuando tienes la cadena representada en ascii no es imprimible
el caracter 0x00 indica que la cadena terminó, y este caracter se agrega cada que tu pones una cadena entre ""
espero te sirva
Saludos
los caracteres CR y LF son retorno de carro y salto de linea.
cuando usas la funcion gets esta lee byte por byte hasta que encuentra un salto de linea, todo lo demas lo guarda en un arreglo que tu le indiques
para trabajar con tu cadena primero tienes que descomponerla y tomar los datos que quieres.
para esto primero guarda lo que recibes de tu sensor en un vector y posteriormente puedes hacer una funcion que vaya recorriendo uno a uno los bytes de tu cadena hasta encontrar un separador, que en este caso es un + y la subcadena que generes la conviertes a un flotante usando atof() y asi obtienes el valor que desees.
espero haberme explicado, si no, con gusto trato de explicarlo de una mejor manera
porque necesitas ese delay para enviar los datos?
Viendo en el manual, entiendo que el comando T3 devolverá 12 valores separados por ',' (coma).
Para leer, digamos el primer valor de "Real Dielectric", que sería el parámetro K se podría intentar algo como....
ir recorriendo la cadena original hasta encontrar el caracter ',' e ir almacenando en alguna variable las posiciones de las ',' encontradas. Luego nos interesará copiar desde la 5º hasta la 6º ',' que sería el parámetro K
Supongo que se podría utilizar un array para almacenar dicha información.Código: C
unsigned char posicionDeComa[15]; void encontrarComas(unsigned char *cadena) { unsigned char indiceDecoma; unsigned char indiceDeCadena; indiceDeComa = 0; indiceDeCadena = 0; while (*cadena != 0) // mientras haya caracteres en la cadena { if (*cadena == ',') { posicionDeComa[indiceDeComa] = indiceDeCadena; indiceDeComa++; } indiceDeCadena++; cadena++; } }
Ése código almacenaría en una array todos los índices de las comas y por lo tanto ese array se lo podría utilizar para copiar las cadenas.
No lo probé, e imagino que será mejorable el código... pero puede servir como punto de partida.