.NET ayuda puerto serie requiere, principalmente con los datos recibidos en varios “paquetes”

StackOverflow https://stackoverflow.com/questions/891475

  •  23-08-2019
  •  | 
  •  

Pregunta

Estoy muy nuevo para el envío de datos a través de un puerto serial a través de .NET y me he dado cuenta después de implementar una contraparte TCP que no iba a conseguirlo tan fácil con número de serie!

Así que para empezar en la parte superior, estoy casi allí con mi serie aplicación de comunicación bidireccional Estoy quedarse atascado en un par de cosas: -

  1. Mi lee están siendo dividido en varios mensajes o recibido como respuesta fragmentada a través del puerto COM y no sé qué ajustes que podría necesitar, o cómo debería escribir el código diferente para solucionar este problema. Que podria causar esto? Estoy inspeccionando el mensaje a un punto de interrupción en SerialPort_DataReceived.

Básicamente, los datos deben ser enviados como:

01: LS|DA090521|TI111043|q
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j

pero está siendo dividido (en posiciones aleatorias en cada solicitaron el leer)

01: LS|DA090521|TI111
02: 043|q
03: PS|RN102|PTC|TA1
04: 0000|P#0|DA090521|TI111429|j

- Pregunta 1 ha sido contestada, gracias Chris W. y otros! Ahora tengo el mensaje que espero que se construye a partir de fragmentos progresivamente (mirando hacia fuera para STX, {cuerpo de mensaje}, ETX) y luego una acción realizada cuando el mensaje ha sido completamente construido, y lo consiguió ir con una cola de flujos seguros, muy feliz .

. 2. Estoy recibiendo un "|" símbolo a través de mi lectura casi cada ciclo, es esto debido a un comando he puesto mal de alguna manera, un artefacto de comunicación en serie, o algo el dispositivo me está enviando? (Yo no lo creo, aunque, como conectividad Hiperterminal revela este carácter no se envía de forma continua.)

. 3. ¿Puede confirmar que estoy leyendo y escribiendo datos correctamente en los métodos respectivos.

Gracias chicos por mirar mis otras dos preguntas también.

código en cuestión de la siguiente manera:

...
    //                          COM3,    9600,     None,   8,        One
    SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
    if (SerialPort.IsOpen) SerialPort.Close();
    // SerialPort.RtsEnable = true; // Request-to-send
    // SerialPort.DtrEnable = true; // Data-terminal-ready
    SerialPort.ReadTimeout = 150; // tried this, but didn't help
    SerialPort.WriteTimeout = 150; // tried this, but didn't help
    SerialPort.Open();

    SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}

void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Process received data
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    int bytesRead = sp.Read(buffer, 0, buffer.Length);

    // message has successfully been received
    message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
}

public bool SendMessage(string text)
{
    // Only send message if a client is connected
    if (SerialPort != null && SerialPort.IsOpen)
    {
        byte[] buffer = Encoding.ASCII.GetBytes(text);
        SerialPort.Write(buffer, 0, buffer.Length);
    }
}
¿Fue útil?

Solución

  

Mi lecturas están siendo dividido en varios mensajes

Esto es normal y esperado, el comportamiento inevitable. Puede suceder con los datos-sobre-TCP también. A la interfaz serie es sólo un interminable flujo de bytes. Es responsabilidad de la aplicación para volver a empaquetar los bytes en los paquetes.

Si la ubicación de los límites del paquete es importante, y si no se puede saber donde se supone que los límites de los paquetes a ser de mirar los datos recibidos, entonces puede que tenga que replantearse el formato de los datos para que puede saber dónde los límites de los paquetes son.

  

Estoy recibiendo un "|" símbolo a través de mi lectura casi cada ciclo

¿Cuál es el valor hexadecimal de ese personaje? Ver si establecer la propiedad Handshake a XOnXOff o RequestToSendXOnXOff mejora la situación.

Otros consejos

En el nivel más bajo es el puerto serie puede decidir cuándo activar los datos recibidos evento. Podría decidir hacerlo antes de llegar el paquete "completo". Sin embargo, parece que tiene un carácter de terminación en el conjunto de datos esperado. Si es así, puede hacer lo siguiente (tenga en cuenta que he cambiado su asignación SerialPort para evitar confusiones sintaxis:

        p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits);
        p.NewLine = Terminator;

donde Terminator es una cadena que contiene tu personaje (s) terminación. A continuación, puede utilizar SerialPort.ReadLine () (y SerialPort.WriteLine () si se aplica). Esto puede al menos ayudar con su primera emisión.

He hecho un montón de programación Win32 puerto serie, pero sólo un poco con .NET, así que tome mi consejo con un grano de sal.

  

Mi lecturas están siendo dividido en varios mensajes o recibido como respuesta fragmentada a través del puerto COM y no sé qué ajustes que podría necesitar, o cómo debería escribir el código diferente para solucionar este problema.

Como otros han dicho, esto es perfectamente normal. Dependiendo de qué tipo de equipo está en el lado DCE, es posible que tenga que hacer volver a embalar usted mismo. No estoy seguro de qué tipo de equipo que está enganchado hasta lo que no puedo decir mucho más.

Si desea obtener más información, puede intentar lo siguiente:

  • ajustar la propiedad System.Int32 ReceivedBytesThreshold
  • usando síncrono I / O y la especificación de un número fijo de bytes a leer en lugar de recepción basado en eventos
  

Estoy recibiendo un "|" símbolo a través de mi lectura casi cada ciclo, es   esto debido a un comando que he establecido   erróneamente alguna manera, un artefacto de serie   la comunicación, o algo por el dispositivo   me está enviando? (No lo creo   sin embargo, como la conectividad Hiperterminal   revela este personaje no está siendo   enviado continuamente.)

Si eres curioso acerca de lo que está pasando sobre la línea, echa un vistazo a PortMon de SysInternals , una aplicación gratuita que va a espiar a su puerto de comunicaciones mientras se está transfiriendo datos a través de la línea. Parece técnica, pero en realidad sólo hay que mirar el IRP_MJ_WRITE y comandos IRP_MJ_READ, y en la línea que va a ver la longitud en bytes y los datos que se envían a través del cable. Con esto, usted debe ser capaz de decir si el problema es el objeto de .NET SerialPort o si el dispositivo está enviando realidad "|" sobre la línea.

  

¿Puede confirmar que estoy leyendo y   escribir los datos correctamente en el   métodos respectivos.

Parece adecuado para el método basado en el caso de la recepción de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top