Convertir una cadena ASCII en flujo de bits

1

Estoy realizando un proyecto en el que obtengo datos de algunos interruptores y botones en los pines de 8051 uC. Ahora tengo que transmitir estos datos en los pines del puerto en serie a la PC.  Al final de la PC, estoy recibiendo los datos en la aplicación C # .Net utilizando la clase de puerto serie. Ahora el problema es que quiero que los datos recibidos en la aplicación C # estén en forma de cadena de bits en lugar de ASCII.

¿Puede alguien guiarme en cómo se puede lograr?

    
pregunta Rehan Abbasi

2 respuestas

2

No está claro lo que está preguntando ya que ASCII es un flujo de bits.

En cualquier caso, especialmente cuando tiene su propia aplicación en la PC, tiene sentido enviar datos en binario a través de la línea serial. ASCII es para humanos, pero tienes dos máquinas que se comunican entre sí. La PC puede mostrar los datos en cualquier forma adecuada para los usuarios, pero no hay necesidad de que se parezca al formato de los datos enviados desde el microcontrolador.

Dado que el extremo más limitado de la línea de comunicaciones es el microcontrolador, use el formato más fácil para él. Eso será solo el envío de bytes en bruto. Por lo general, uso paquetes que comienzan con un byte de código de operación, seguido de los datos definidos para ese código de operación. Es fácil de enviar y recibir en un pequeño micro, sin necesidad de voluminosas y lentas ASCII a rutinas de conversión binarias y binarias a ASCII.

En el lado de la PC, tiene un poder de cómputo esencialmente infinito en relación con la velocidad de la línea serie, por lo que puede acomodar cualquier formato. Sin embargo, el binario en bruto es tan fácil como llega allí.

Lo único que hay que vigilar es no hacer suposiciones implícitas sobre el orden de bytes que utiliza la máquina host para los valores de varios bytes. Defina lo que sea más fácil para el microcontrolador, luego trabaje con eso en el extremo de la PC. Por ejemplo, digamos que el micro almacena datos de múltiples bytes en el orden de bytes de menos significativo a más significativo. No haga algo estúpido como definir una unión en C y escribir los bytes recibidos en superposiciones de campos de bytes de valores más amplios. Eso hace que su programa host dependa de la máquina. En su lugar, haz el cambio y todo estará bien. Por ejemplo, para ensamblar una cantidad de 16 bits en un entero más ancho, escriba el primer byte en él directamente, luego O el segundo byte en él después de que ese byte se desplazó a la izquierda 8 bits. Eso siempre funcionará independientemente del orden de bytes de la máquina host.

En cuanto a la conversión de valores binarios a ASCII, existen varias facilidades para eso en cualquier idioma. Ese es un problema de lenguaje puro y está fuera del alcance aquí, y además es trivial de todos modos.

    
respondido por el Olin Lathrop
2

Lo que dices suena como si estuvieras en realidad obteniendo los bits exactos que llegan al puerto (excepto los bits de inicio / parada, etc.), pero de alguna manera te has engañado pensando que el contenido de sus variables son "simbolos". Eso no tiene sentido: .NET SerialPort class le dará solo bits en bruto, en lotes de 8 bits por cada C # byte o 16 bits por cada C # 's char . Si estos bits codifican o no los símbolos o algo más es para que usted decida.

Lo que elijas hacer con esos bits después de haberlos recibido es tu elección. Puede elegir para tratar los 8 bits que se encuentran en su variable byte como si codificaran el número de un carácter ASCII y mostrar ese carácter, pero nadie dice que tiene Para hacer eso. Los bits son bits; no hay nada especial en esos 8 bits que dicen que deben interpretarse como un punto de código ASCII. Puede hacer lo que quiera con él: byte (o, en realidad, char ) es un tipo aritmético, y todos los cambios habituales y las operaciones lógicas para manipular cadenas de bits están a su disposición inmediata.

No esperaba que SerialPort le entregara bits en forma de códigos ASCII para los caracteres "0" y "1", ¿verdad? Eso sería un desperdicio y, para la mayoría de los propósitos prácticos, no tendría ningún sentido.

    
respondido por el Henning Makholm

Lea otras preguntas en las etiquetas