Título: Usar read en entrada de datos Publicado por: Meta en 1 Diciembre 2023, 22:27 pm Una consulta.
A partir de la S en el delimitador indicado abajo. Código
Concretamente esto de abajo. Código
Más aún el: Código
En realidad es un binario mezclado con caracteres tipo string del principio. Por muy encoder que use el ponerlo en un Windows Form siempre me suelta 63 en decimal. Código
Ya que al capturar datos en el puerto serie lo almaceno tipo String. Parece ser que es mejor optar por almacenar los datos o tramas de bytes que llegan desde el puerto serie en tipo byte[] y usar read. Uso el protocolo este para el puerto serie. Código
A la hora de recibir datos, mejor obtener ***** bytes sin formato, tal como vienen y almacenarlo. ¿Cuál es la mejor forma para almacenar datos en un array de bytes? Ya que luego la parte de la S, quiero mostrarlo en decimal para luego verlo en binario. Saludos. Título: Re: Usar read en entrada de datos Publicado por: Meta en 2 Diciembre 2023, 11:12 am Buenas:
Todavía sigo chamusqueándome las neuronas. Teniendo estos resultados que viene tipo string, lo convierto en hexadecimal y en binario con Windows Form. Citar #I223.4O223.6L007B100V26.0F50.2H50.2R0080S?????? 23493232332E344F3232332E364C303037423130305632362E304635302E324835302E325230303830533F3F3F3F3F3F0D 1000111001001110010110010110011101110110100100111111001011001011001110111011011010011001100001100001101111000010110001110000110000101011011001011011010111011000010001101101011100001011101100101001000110101110000101110110010101001011000011000011100011000010100111111111111111111111111111111111111111101 ¿Cómo se puede capturar los datos exactamente sin editar tal como se recibieron tal como si se muestra abajo? Precisamente son estos: 35 73 50 50 51 46 52 79 50 50 52 46 50 76 48 48 55 66 49 48 48 86 50 54 46 48 7 0 53 48 46 49 72 53 48 46 49 82 48 48 56 48 83 144 132 128 136 132 192 13 Ver imagen con un terminal que si lo hace. (https://i.postimg.cc/zBGmR52q/SAI-UPS-captura-datos-tal-como-vienen.jpg) Ver zoom (https://i.postimg.cc/zBGmR52q/SAI-UPS-captura-datos-tal-como-vienen.jpg). Lo marcado en rojo arriba es justo lo que quiero meter en un array para luego mostrarlo uno a uno en Windows form con su label correspondiente. Espero que así se entienda mejor. Código hecho en Windows Form en C# es este: Código
¿Alguna idea? Saludos. Título: Re: Usar read en entrada de datos Publicado por: Meta en 2 Diciembre 2023, 13:41 pm Al final se hace así:
Código
Cuyo resultado no es el esperado. Me da esto: 35735049574657795050484655764849496649484886505446487053484650725348465082484851568363636363636313 El 83 es la S y el 13 es este \r, entre medio hay seis veces el 63, que no debería mostrar porque la conversión está mal, no es el real, el real es el que indiqué antes. 35 73 50 50 51 46 52 79 50 50 52 46 50 76 48 48 55 66 49 48 48 86 50 54 46 48 7 0 53 48 46 49 72 53 48 46 49 82 48 48 56 48 83 144 132 128 136 132 192 13 Se ve que a la hora de recibir datos uso esta variable tipo string. Código
Por lo que se ve, no es el adecuado cuando quieres los byte tal cual vienen sin modificar o usar encoder. Parece ser que la mejor manera es usar una array o matriz como esta: byte[] = cadenaByte; Título: Re: Usar read en entrada de datos Publicado por: EdePC en 2 Diciembre 2023, 22:49 pm Cuidado con las codificaciones, los datos reales serán bytes, si a alguno de esos bytes los conviertes a char o string dependerá de la codificación en turno como se hará la conversión y como se hará la visualización, ahí tienes esos dos problemas.
Supuestamente los caracteres problemáticos son 5: €„€ˆ„ pero incluso en la salida que consideras correcta salen 6: 144 132 128 136 132 192 y si las miras bien verás que no encaja con los caracteres que se repiten, así que tampoco es la correcta. Citar Parece ser que es mejor optar por almacenar los datos o tramas de bytes que llegan desde el puerto serie en tipo byte[] y usar read. No sé como estás guardando los datos así que supondré que estás usando puertoSerie.ReadChar(), puertoSerie.ReadLine(), o similar, estos trabajan y convierten basándose en la codificación y por lo tanto habrán cambios si no lo tienes controlado. Si usas puertoSerie.ReadByte() si conseguirás los bytes reales pero para visualizarlos debes usar una codificación adecuada igual o similar a la empleada para representar esos bytes. Por ejemplo si tienes el decimal 128 y lo quieres mostrar usando codificación ANSI obtendrás: €, pero si usas ASCII obtienes ? (63) porque no existe en la tabla ASCII Si haces la lectura con ReadByte() y luego cada byte lo pasas a Int no deberías tener problemas salvo la cantidad de bytes que dependerá de la codificación Título: Re: Usar read en entrada de datos Publicado por: Meta en 3 Diciembre 2023, 08:07 am Buenas.
Lo estaba guardado los bytes en tipo string. Como indicas, mejor usar sin codificación alguna los bytes recibidos para ternerlo tal cual. Se ve que la mejor opción para recibir los bytes tal cual natural es usando lo que dijiste. Código https://learn.microsoft.com/es-es/dotnet/api/system.io.ports.serialport.readbyte?view=dotnet-plat-ext-8.0&viewFallbackFrom=net-6.0 https://learn.microsoft.com/es-es/dotnet/api/system.io.filestream.readbyte?view=net-6.0 https://learn.microsoft.com/es-es/dotnet/api/system.runtime.interopservices.marshal.readbyte?view=net-6.0 El que estaba usando es este. https://learn.microsoft.com/es-es/dotnet/api/system.io.ports.serialport.readexisting?view=dotnet-plat-ext-8.0&viewFallbackFrom=net-6.0 No parece ser el más adecuado por lo que se ve. Estoy gracias a ti, que estos códigos, pero quiero leer bien la parte S y mostrarlo todos los datos en decimal de la trama de bytes que vienen el puerto tal cual. Lo hace bien el RealTerm como se mostró en la imagen de arriba (https://i.postimg.cc/zBGmR52q/SAI-UPS-captura-datos-tal-como-vienen.jpg). Código
A ver si hay suerte y me sale las cosas. Título: [RESUELTO] Usar read en entrada de datos Publicado por: Meta en 6 Diciembre 2023, 21:33 pm Ya funciona, solo había que poner el encoder correcto.
Código
Muchas gracias. |