• Viernes 19 de Abril de 2024, 22:46

Autor Tema:  Leer El Puerto Serie  (Leído 11861 veces)

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Leer El Puerto Serie
« en: Lunes 16 de Octubre de 2006, 01:54 »
0
Hola, estoy realizando una aplicacion con el puerto serie. Desde un módulo externo envio por radiofrecuencia a traves de una UART un dato en binario. Este dato por ejemplo es 0010 0101 (el nº25) y lo quiero representar en una Label. Si yo he enviado 25, tengo que representar 25 pero me representa caracteres del codigo ASCII.
Para capturar por el puerto serie estoy usando el componente CPortLib y este es el codigo con el que leo el puerto:

AnsiString a;                           // Declaro una variable
ComPort1->ReadStr(a,Count); // Leo el puerto serie cargandose el valor en 'a'
Label8->Caption = a;              // Represento el valor leido del puerto en la Label8

Creo que como la variable 'a' es de tipo String se representa como un caracter, pero no se como tratarla para que aparezcan 2 caracteres que formen 25 y se represente el valor que he enviado desde el exterior.

Un saludo y gracias

salomon_ve

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #1 en: Lunes 16 de Octubre de 2006, 08:57 »
0
el numero 25 se representa de la siguiente manera en codigo Ascii

50=2

53=5

osea que en binario seria:


0011 0010 =2 ascii ->32 hex  -> 50 dec
0011 0101 =5 ascii  ->35 hex  -> 53 dec


0010 0101 = % que en HEX es igual a 25 osea que no estas enviando 25 decimal, sino 37 decimal y 25 hexadecimal



espero haberte ayudado, ya el problema esta mas facil de solucionar


salu2

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #2 en: Lunes 16 de Octubre de 2006, 11:23 »
0
Gracias por contestar.
No me habia dado cuenta de eso, pero la mayor duda que tengo es como tratar la variable para que represente en este caso entonces 37 en decimal.
Me has comentado que si envio 0010 0101 equivale a 37 decimal, estoy de acuerdo, pero si tengo en la variable capturada por el puerto serie el valor 37 decimal como la trato para que cuando la represente en la Label me aparezca el propio 37 y no aparezca el simbolo %.
La aplicacion que estoy realizando se basa en enviar desde un micro el valor capturado por el conversor analogico/digital de la temperatura, si el micro envia 37 tengo que representar 37.
Un saludo y gracias de nuevo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #3 en: Lunes 16 de Octubre de 2006, 12:25 »
0
Usa ltoa:

ltoa(long integer, char *string, int radix);

Código: Text
  1.  
  2. char str_num[10];
  3. ZeroMemory(str_num, sizeof(str_num));
  4. ltoa(numero, num, 10);
  5.  
  6.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #4 en: Lunes 16 de Octubre de 2006, 15:12 »
0
Perdona, pero me lo puedes explicar con mas detalle?
Hasta ahora yo tengo esto, primero me defino la variable tipo string, luego leo el COM y lo cargo en 'a'. Antes de representarlo tego que tratar la variable 'a' de la forma que me dices pero no lo entiendo bien.

AnsiString a;
ComPort1->ReadStr(a,Count);
.
.
.
.
Label8->Caption =a;

Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #5 en: Lunes 16 de Octubre de 2006, 15:30 »
0
Cita de: "alloger"
Perdona, pero me lo puedes explicar con mas detalle?
Hasta ahora yo tengo esto, primero me defino la variable tipo string, luego leo el COM y lo cargo en 'a'. Antes de representarlo tego que tratar la variable 'a' de la forma que me dices pero no lo entiendo bien.

AnsiString a;
ComPort1->ReadStr(a,Count);
Label8->Caption =a;
Lamentablemente no, ya que casi todo lo que usas no es standard. Tal vez esa clase AnsiString tenga un metodo tipo c_str() pero no lo se ... el codigo que te deje es MUY simple, lo que hace es pasar un numero contenido en una variable de tipo int/long o lo que fuera a una cadena.

Empeza probando lo simple: inicializa la variable a manualmente (supongo que AnsiString a("hola"); funcionara) y asignando como hasta ahora (Label8->Caption =a;) tal vez ahi este el error incluso ... si eso no va proba con Label8->Caption = a.c_str(); y deberia funcionar.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #6 en: Martes 17 de Octubre de 2006, 01:56 »
0
Ya casi lo tengo, hasta ahora este es el codigo que empleo y funciona casi bien:

//---------------------------------------------------------------------------

void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
{

        AnsiString a, dato1;
        ComPort1->ReadStr(a,Count); // Leo el puerto serie cargando el valor en 'a'
        dato1 = AnsiString((int)(a.c_str()[0]));
        Label8->Caption = "";
        Label8->Caption =dato1;
        temperatura= StrToInt(dato1);
}

Lo voy a pulir un poco mas y si no lo consigo ya os preguntaré

Un saludo

Drache

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #7 en: Jueves 26 de Octubre de 2006, 08:25 »
0
Hola, estoy muy interesado en programar usando el puerto serial....

hasta ahora ya he realizado programas usando el puerto paralelo, pero lo ideal es que sepa usar cualquiera de los dos.

bueno, si tu no sabes usar el paralelo yo te enseño como y tu me cuentas lo que sabes del serial xD

yo uso el C++ Builder 5 para programar, ¿cual usas tu?

Un saludo

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #8 en: Jueves 26 de Octubre de 2006, 13:50 »
0
Mi aplicacion la estoy desarrollando con C++ builder 6. Pero para usar el puerto serie de una forma sencilla y con poca programacion necesiats instalar un componente comercial que no sale con el builder, se llama CPorLib y en este enlace tienes el archivo para descargar.

http://comport.sourceforge.net

En este otro como se usa:

https://www.upv.es/bin2/caches/miw/visfit?id=328179&idioma=C

De momento no necesito usar el puerto paralelo pero si me das algun enlace que me lo explique lo guardaré por si acaso

Un saludo

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #9 en: Martes 31 de Octubre de 2006, 12:43 »
0
Hasta ahora tengo esto para tratar los datos del puerto serie:

        int dato3;
        char string[10];
        AnsiString b, dato2;

        ComPort1->ReadStr(b,Count);
        dato2 = AnsiString((int)(b.c_str()[0]));
        dato3=StrToInt(dato2);
       
        itoa(dato3, string, 10);

        Label10->Caption = "";
        Label10->Caption = string;

Con esto si que a veces me representa bien el dato ya que estoy enviando 0x25 y me representa en la Label10 el valor de 25. Lo que ocurre es que no siempre lo hace, si que en ocasiones representa 25 pero en otras el valor representado es otro. Con estas instrucciones creo que le estoy dando muchas vueltas a la variable capturada hasta obtenerla en el formato deseado.

Existe otra instruccion para la lectura del puerto COM pero no me representa bien el valor:

       char buffer [10];
        char cadena[10];
        int valor;
        valor=ComPort1->Read(buffer,8);
   
        itoa(valor, cadena, 10);
        Label10->Caption = "";
        Label10->Caption = cadena;

De esta forma aparentemente la variable no es tratada tantas veces pero el valor representado no es el esperado.

Sabe alguien (Eternal Idol) como solucionar esto?

Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #10 en: Martes 31 de Octubre de 2006, 13:08 »
0
¿Sale 37 por casualidad? Si es asi cambia la base 10 (decimal) por la 16 (hexadecimal).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #11 en: Martes 31 de Octubre de 2006, 14:03 »
0
No, no, de casualidad no es. Cuando envio por ejemplo 0x25 en la label si aparece 25, si envio 58 aparece 58 que esto era lo que queria conseguir. Lo que ocurre es que no siempre se representa el valor deseado.

El envio se realiza cada 1 segundo y unas veces se representa el deseado 25 pero otras veces se representa -58 ó -116. No se si existe alguna relacion entre el 25 y estos otros 2 numeros, pero lo que deseo es que solo aparezca 25.

Otro tema bastante improtante que he dejado al margen es que los datos son enviados al PC mediante Radio Frecuencia desde una UART externa y a lo mejor existen perturbaciones o interferencias que influyan en la emision.


Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #12 en: Martes 31 de Octubre de 2006, 14:08 »
0
Me referia al segundo metodo ... y no entiendo como ves 25 si estas seguro de que llegue 0x25 ya que es 37 ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #13 en: Martes 31 de Octubre de 2006, 15:09 »
0
Vale, lo siento me he confundido. Lo que envio es (0001 1001) es 25 en binario. Por este motivo si se representa en ocasiones el 25 en la Label

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #14 en: Martes 31 de Octubre de 2006, 15:52 »
0
Pero aun asi me siguen llegando datos erroneos, supongo que seran interferencias a algo similar.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #15 en: Martes 31 de Octubre de 2006, 15:55 »
0
Cita de: "alloger"
Pero aun asi me siguen llegando datos erroneos, supongo que seran interferencias a algo similar.
No lo se pero seguro que no fue pensado esto para usar ReadStr ... podrias probar leyendo tipos numericos tal vez ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #16 en: Martes 31 de Octubre de 2006, 16:30 »
0
Te refieres a intentarlo en vez de usar ReadStr(AnsiString &Str, int Count);
utilizar esta otra Read(void *Buffer, int Count);

char buffer [10];
char cadena[10];
int valor;
valor=ComPort1->Read(buffer,8);

itoa(valor, cadena, 10);
Label10->Caption = "";
Label10->Caption = cadena;

Hasta el momento no he obtenido resultados, pero seguiré investigando con este otro metodo entoces.

Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #17 en: Martes 31 de Octubre de 2006, 16:35 »
0
Cita de: "alloger"
Te refieres a intentarlo en vez de usar ReadStr(AnsiString &Str, int Count);
utilizar esta otra Read(void *Buffer, int Count);
Si, por ejemplo ... pero yo haria (tal vez me equivoque pero es lo logico):

Código: Text
  1.  
  2. int valor;
  3. valor = ComPort1->Read(valor, &sizeof(valor));
  4.  
  5.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #18 en: Martes 31 de Octubre de 2006, 17:27 »
0
Probando de esta forma:

valor = ComPort1->Read(valor, &sizeof(valor));

Me esta dando error de compilacion en esa linea

     - El primero me dice que no puede convertir 'int' a 'void*'. Supongo que es porque la estructura es así:  Read(void *Buffer, int Count);

     -El otro me dice que debo tomar la dirección de una posición de memoria

La verdad es que soy electronico y todo esto me esta empezando a superar, pero si consigo realizar esto ya tengo el proyecto terminado

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #19 en: Martes 31 de Octubre de 2006, 18:06 »
0
Estupido error mio ... deberia ser valor = ComPort1->Read(&valor, sizeof(valor));

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #20 en: Martes 31 de Octubre de 2006, 19:28 »
0
Creo que voy a desistir ya de este tema.

Me quedo con este codigo:

        int dato3;
        char string[25];
        AnsiString b, dato2;

        dato2=ComPort1->ReadStr(b,Count);
        dato2 = AnsiString((int)(b.c_str()[0]));
        dato3=StrToInt(dato2);
        ZeroMemory(string, sizeof(string));
        itoa(dato3, string, 10);

        Label10->Caption = "";
        Label10->Caption = string;


Creo que trata la variable demasiadas veces, pero es el codigo con el cual obtengo el resultado mas proximo al deseado. Con este codigo recibo 1 valor bueno de cada 3 enviados, pero siempre se repite que de esos 2 valores erroneos son los 2 negativos, asi que la forzaré el valor con algun tipo de condicional.

Con este otro codigo:

        int valor;
        valor = ComPort1->Read(&valor, sizeof(valor));

        Label8->Caption = "";
        Label8->Caption = valor;

Tambien he probado a colocar 'itoa'  y el resultado obtenido siempre es el mismo, envie lo que envie solo obtengo '1' en la Label

Si se te ocurre algo mas para probar estaré agradecido si me lo comentas.

Un saludo

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #21 en: Martes 31 de Octubre de 2006, 19:32 »
0
La primera manera me parece erronea ... sigo estando borracho parece ... la segunda te da siempre 1 por una razon, Read() devuelve true y el codigo que puse estaba pesimo ...

Código: Text
  1.  
  2. int valor = 0;
  3. bool ret = false; << supongo que sera bool y sino sera int, da lo mismo
  4. ret = ComPort1->Read(&valor, sizeof(valor));
  5.  
  6.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #22 en: Martes 31 de Octubre de 2006, 20:32 »
0
Nos vamos acercando al resultado, el porcentaje de valores buenos representados es mas alto con este nuevo codigo 6 de cada 10 datos enviados aprox. se corresponden con el resultado, pero todavia sigo sin comprender esos errores.

He colocado este codigo:

        int valor = 0;
        bool ret =false;
        ret = ComPort1->Read(&valor, sizeof(valor));

        Label8->Caption = "";
        Label8->Caption = valor;

Yo pensaba en representar 'ret' en lugar de 'valor' pero me da errores de compilacion. Supongo que estaba equivacado. Colocando 'itoa' los resultados son similares.

En estos momentos estoy enviando (0000 1111) y en la Label me representa varios valores prodominando el 15, pero tambien valores como 248 ó 135.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #23 en: Martes 31 de Octubre de 2006, 20:46 »
0
Cita de: "alloger"
Yo pensaba en representar 'ret' en lugar de 'valor' pero me da errores de compilacion. Supongo que estaba equivacado. Colocando 'itoa' los resultados son similares.
ret es el resultado, verdadero o falso dependiendo de si logro leer o no. En valor esta el valor leido justamente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Leer El Puerto Serie
« Respuesta #24 en: Martes 31 de Octubre de 2006, 21:42 »
0
Cita de: "alloger"
En estos momentos estoy enviando (0000 1111) y en la Label me representa varios valores prodominando el 15, pero tambien valores como 248 ó 135.
Comproba que estes configurando bien el puerto, velocidad incluida y que no la estes sobrepasando.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.