none
Conversion System::String^ a unsigned char RRS feed

  • Pregunta

  • Hola a todos;

    Tengo el siguiente problema:

    Debo enviar una serie de comandos por puerto serie. Estos comandos estan declarados como unsigned char.
    Resulta, que estos comandos los debo introducir en una caja de texto, cuyo contenido es un String. No encuentro ninguna forma de convertir ese string a unsigned char para poder enviarlo por el puerto serie.

    Por ejemplo: quiero mandar el comando 0xF3 por puerto serie.
    declaro unsigned char comando;

    Si lo mandara directamente, simplemente haria comando = 0xF3;
    Pero lo que debo hacer es introducir el comando en un TextBox, y al darle a un boton, que se mande el comando. Entonces, el compilador muestra el problema de tipos incompatibles.+

    He logrado solucionar en parte el problema mediante la funcion:

    System::Byte::TryParse(TextBox1->Text,comando);

    pero solo me convierte bien si no hay letras en el comando, es decir, si escribo en el TextBox 23, 45, 94, etc

    Si escribo 2F, A3, etc...el contenido de comando es 0.

    ¿Alguna idea de cual podria ser la solucion?

    Gracias!!!!!

    lunes, 8 de marzo de 2010 15:53

Todas las respuestas

  • El problema reside en que String utiliza wchar_t, no utiliza char. Pero con String::ToCharArray() tienes un array<wchar_t> que puedes utilizar. Busca sobre convertir wchar_t a char, haces un loop en cada uno de los wchar_t y lo almacenas en un char.
    lunes, 8 de marzo de 2010 16:19
  • Hola,

    este pequeño código convierte de String^ a char*:

    using namespace System;
    using namespace System::Runtime::InteropServices;
    ....
    String^ str = gcnew String("ejemplo");
    IntPtr p = Marshal::StringToHGlobalAnsi(str);
    char* sz = static_cast<char*>(p.ToPointer());
    Marshal::FreeHGlobal(p);

    y lixto, sz tendrá el valor convertido.

    > quiero mandar el comando 0xF3 por puerto serie.
    > declaro unsigned char comando;
    >
    > Si lo mandara directamente, simplemente haria comando = 0xF3;
    > Pero lo que debo hacer es introducir el comando en un TextBox, y al darle
    > a un boton, que se mande el comando. Entonces, el compilador muestra el
    > problema de tipos incompatibles.+
    >
    > He logrado solucionar en parte el problema mediante la funcion:
    > System::Byte::TryParse(TextBox1->Text,comando);
    >

    Mmm, revisando esto... 0xF3 es un byte, un número, equivalente al número 243
    en representación decimal (y que corresponde al caracter <= de la tabla
    ASCII). El caso es que si tú envías "0xF3", como cadena de texto, en
    realidad estás enviando cuatro bytes: 0x30 para el "0", 0x78 para la "x",
    0x46 para la "F" y 0x33 para el "3". Y supongo que esto no es lo que
    quieres. Yo pienso que lo que debes de hacer es convertir a entero (o byte)
    el valor ingresado en el TextBox, y eso es lo que deberías pasar a tu puerto
    serial. Algo así:

    String^ str = gcnew String("ejemplo");
    IntPtr p = Marshal::StringToHGlobalAnsi(str);
    char* sz = static_cast<char*>(p.ToPointer());
    Marshal::FreeHGlobal(p);
    unsigned char comando = static_cast<unsigned char>(atoi(sz));

    Saludos.



    Fernando Gómez
    www.fermasmas.com
    lunes, 8 de marzo de 2010 17:11
  • Gracias por las respuestas.

    Fernando, he probado a hacer lo que me dices, pero parece que la conversion siempre da cero!!!!

    Ademas, yo no envio 0x34 como cadena de texto, yo la envio como unsigned char;

    Yo declaro, unsigned char comando = 0x34, y despues lo mando directamente asi.
    Eso funciona correctamente, y el controlador que lo recibe despues que lo envie por puerto serie lo reconoce perfectamente.


    martes, 9 de marzo de 2010 10:01

  • Tu tienes una cadena de caracteres administrada (System::String) en el
    TextBox. Con el código que te pasé lo conviertes a cadena no administrada
    (char*). Ahora, esa cadena la tienes que convertir a un número (un unsigned
    char es un número también). Si dicha cadena es un número en decimal, utiliza
    atoi. Si la cadena es un número hexadecimal (lo cual es obvio dado que
    prefijas con 0x, debí hacer la aclaración en el post anterior) utiliza
    strtol [1]. Y con eso deberías tener.

    [1] http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/

    Saludos.



    Fernando Gómez
    fermasmas.wordpress.com
    martes, 9 de marzo de 2010 15:56
  • Sigue sin funcionar Fernando.

    Aver, si yo hago directamente, unsigned char comando = 0x34, y luego visualizo comando mediante comando.ToString(); me da el valor decimal de comando.

    Como tu me has dicho, al visualizar el contenido de comando de la misma forma, me aparece 0. Por esto deduzco que esa forma no es la correcta.

    Yo he hecho lo que tu me has indicado, concretamente he escrito el siguiente codigo:

    unsigned char comando;

    IntPtr p = Marshal::StringToHGlobalAnsi(textBox->Text);
    char* sz = static_cast<char*>(p.ToPointer());
    Marshal::FreeHGlobal(p);
    comando=static_cast<unsigned_char>(strtol(sz,&sz,16);

    Ese es mi codigo para transformar, que como te dije antes, no funciona.

    Un saludo




     

    Marshal::FreeHGlobal(p);

    direccion =

    static_cast<unsigned char>(strtol(sz,&sz,16));

    jueves, 11 de marzo de 2010 14:48
  • Tambien he pensado convertir primero el contenido del textBox a entero, y luego convertirlo a unsigned char. Seria asi

    comando = (unsigned char)Convert::ToInt16(textBox->Text);

    pero claro, esto solo funciona cuando introduzco una direccion solo de numeros, en cuanto introduzco alguna letra hexadecimal, por ejemplo, F5, salta una excepcion.

    Por favor, ayudaaaaaaaaaaa!!!
    jueves, 11 de marzo de 2010 15:13
  • Perfecto Sopita.

    En el cuadro de texto tengo que poner la direccion 34, si pongo 0x34 no funciona, pero es una muy wena solucion, puesto que no me exigen que el formato de la direccion sea 0x..

    Gracias otra vez.

    Saludos

    jueves, 11 de marzo de 2010 15:38
  • Buenas noches,

    Marodal, ¿cuál es la solución que te propuso Sopita? Estoy con el mismo problema que tú: tengo textbox que se pueden introducir códigos hexadecimal y estos códigos los he de mandar por usb como unsigned char y no soy capaz de realizar la conversión.

    Muchísimas gracias.

    Un saludo.

    sábado, 3 de abril de 2010 0:51
  • Muy buenas,

    Esta es la solucion que tengo yo para resolver tu problema.

    Supongamos que tienes un textBox (llamemosle textBox1) donde introduces el codigo en hexadecimal que tienes que mandar como unsigned char por usb.

    Declaras una variable unsigned char donde almacenaras el codigo en hexadecimal:

    unsigned char codigo;

    La conversion te la realiza la siguiente sentencia de codigo:

    System::Byte::TryParse(texBox1->Text,NumberStyles::AllowHexSpecifier, nullptr, codigo);

    De esta forma, en la variable codigo se almacena el valor unsigned char del dato hexadecimal.

    Espero que te sirva de ayuda, y perdona la tardanza, pero he estado toda la semana de vacaciones.

    Un saludo!

    lunes, 5 de abril de 2010 10:06
  • Muchas gracias Marodal. A la solución que me has comentado, tenía que añadir algo más de código para que no me diera error. Al final dicha instrucción, en mi código quedaría:

    System::Byte::TryParse(textBoxByte1E->Text, System::Globalization::NumberStyles::AllowHexSpecifier,nullptr, codigo)

    Gracias de nuevo.

    Un saludo.

    lunes, 5 de abril de 2010 20:53