serie serial puerto net enviar entre denegado datos comunicacion com1 acceso c# serial-port packets

serial - enviar datos de c# a arduino



Dividir mensaje en comunicaciĆ³n serial (3)

Soy nuevo en la comunicación serial. He leído unos pocos tutoriales, y la mayoría de lo que estoy tratando de hacer es trabajar, sin embargo, tengo una pregunta sobre la comunicación serial con C #. Tengo un microcontrolador que constantemente envía datos a través de una línea serie. Los datos están en este formato: bxxxxixx.xx, xx.xx * donde las x representan números diferentes, + o - signos. En ciertos momentos, quiero leer esta información de mi programa C # en mi PC. El problema que estoy teniendo es que mis mensajes parecen estar divididos en posiciones aleatorias aunque estoy usando ReadTo ("*"); Supuse que esto leería todo hasta el * personaje. ¿Cómo puedo asegurarme de que el mensaje que recibí esté completo?

Gracias por tu ayuda.

public string receiveCommandHC() { string messageHC = ""; if (serialHC.IsOpen) { serialHC.DiscardInBuffer(); messageHC = serialHC.ReadTo("*"); } return messageHC; }


Casi siempre encontrará en las comunicaciones en serie que los mensajes de datos (a menos que sean muy pequeños) están divididos. Esto se debe principalmente a la velocidad de comunicación y al punto en el que recuperas datos del puerto.

Por lo general, debe configurar su código para que se ejecute en un hilo separado (para ayudar a evitar que afecte el rendimiento del resto del código), lo que genera un evento cuando se recibe un mensaje completo y también recibe mensajes completos para su transmisión. La función de lectura y escritura es tratada por subprocesos de trabajo (el tráfico de comunicaciones en serie es lento).

Necesitará un buffer de lectura y escritura. Estos deben ser adecuados y grandes para contener datos durante varios ciclos.

Anexe datos leídos de la entrada al final de su búfer de lectura. Haga que el búfer de lectura se lea cíclicamente para los mensajes completos, desde el inicio del búfer.

Dependiendo del protocolo utilizado, generalmente hay un inicio de datos y tal vez un indicador de finalización de datos y, en alguna parte, un tamaño de mensaje (esto puede corregirse, de nuevo dependiendo de su protocolo). De su protocolo deduzco que el carácter de inicio del mensaje es ''b'' y el carácter del final del mensaje es ''*'' . Deseche todos los datos que preceden al carácter de inicio del mensaje (''b''), ya que provienen de un mensaje incompleto.

Cuando se encuentra un mensaje completo, quítelo del frente del búfer y plantee un evento para indicar su llegada.

Se ejecuta un proceso similar para enviar datos, excepto que puede ser necesario dividir el mensaje, por lo tanto, los datos que se envían se anexan al final del búfer y los datos que se envían se leen desde el principio.

Espero que esto te ayude a comprender cómo lidiar con las comunicaciones en serie.

Como señaló Marc, actualmente está borrando su memoria intermedia de una manera que causará problemas.

editar

Como dije en mi comentario, no reconozco serialHC, pero si se trata de datos brutos, entonces mire utilizando la clase SerialPort . Puede encontrar más información sobre cómo usarlo y un ejemplo (que usa aproximadamente el proceso que describí anteriormente) aquí .


No estoy seguro de por qué lo haces, pero estás descartando todo en los puertos serie en el búfer justo antes de leer, así que si la computadora ya ha recibido "bxxx" en ese punto, lo tiras y tú " Solo leeré "xixx.xx, xx.xx".


Voy a suponer que en realidad está recibiendo los extremos de los comandos, es decir, en lugar de obtener b01234.56.78.9 (omitiendo el * final), obtendrá (digamos) .56.78.9 . Eso es porque descartó el buffer de entrada . No hagas eso. No puede conocer el estado en ese punto (justo antes de una lectura), por lo que descartar el búfer es simplemente incorrecto. Elimine serialHC.DiscardInBuffer(); línea.