Tengo dos dispositivos que me gustaría conectar a través de una interfaz en serie, pero tienen conexiones incompatibles. Para evitar este problema, los conecté a mi PC y estoy trabajando en un programa C# que enrutará el tráfico en el puerto COM X al puerto COM Y y viceversa.C# SerialPort: problemas para mezclar puertos con diferentes velocidades de baudios
El programa se conecta a dos puertos COM. En el manejador de eventos de datos recibidos, leo los datos entrantes y los escribo en el otro puerto COM. Para ello, tengo el siguiente código:
private void HandleDataReceived(SerialPort inPort, SerialPort outPort)
{
byte[] data = new byte[1];
while (inPort.BytesToRead > 0)
{
// Read the data
data[0] = (byte)inPort.ReadByte();
// Write the data
if (outPort.IsOpen)
{
outPort.Write(data, 0, 1);
}
}
}
Ese código funcionaba bien, siempre y cuando el puerto COM de salida funcionar a una velocidad de transmisión más alta que el puerto COM de entrada. Si el puerto COM entrante era más rápido que el puerto COM saliente, comencé a perder datos. Tuve que corregir el código como este:
private void HandleDataReceived(SerialPort inPort, SerialPort outPort)
{
byte[] data = new byte[1];
while (inPort.BytesToRead > 0)
{
// Read the data
data[0] = (byte)inPort.ReadByte();
// Write the data
if (outPort.IsOpen)
{
outPort.Write(data, 0, 1);
while (outPort.BytesToWrite > 0); //<-- Change to fix problem
}
}
}
No entiendo por qué necesito esa solución. Soy nuevo en C# (este es mi primer programa), así que me pregunto si hay algo que me falta. El SerialPort tiene como valor predeterminado un búfer de escritura de 2048 bytes y mis comandos son de menos de diez bytes. El buffer de escritura debe tener la capacidad de almacenar los datos hasta que se puedan escribir en un puerto COM más lento.
En resumen, estoy recibiendo datos en COM X y escribiendo los datos en COM Y. COM X está conectado a una velocidad en baudios más rápida que COM Y. ¿Por qué el búfer en el búfer de escritura no maneja esta diferencia? ¿Por qué parece que tengo que esperar a que drene el búfer de escritura para evitar perder datos?
Gracias!
* Actualización *
Como se ha señalado, este código puede correr muy fácilmente en una condición de desbordamiento con grandes transferencias y/o rápidas de datos entrantes. Debería haber escrito más sobre mi flujo de datos. Estoy esperando < comandos de 10 bytes (con < respuestas de 10 bytes) a 10 Hz. Además, estoy viendo fallas en el primer comando.
Así que, aunque sé que este código no se escala y es menos que óptimo, me pregunto por qué los búferes de lectura/escritura de 2-4K ni siquiera podían manejar el primer comando. Me pregunto si hay un error al escribir un solo byte de datos o algo con el controlador de eventos que no entiendo. Gracias.
* Actualización *
He aquí un ejemplo del fracaso:
Digamos que mi mando es de cuatro bytes: 0x01 0x02 0x3 0x4. El dispositivo en COM X envía el comando. Puedo ver que el programa C# recibe cuatro bytes y los envía al dispositivo en COM Y. El dispositivo en COM Y recibe dos bytes: 0x01 0x03. Sé que el dispositivo en COM Y es confiable, así que me pregunto cómo se eliminaron los dos bytes.
Por cierto, ¿alguien me puede decir si es mejor responder a las preguntas con comentarios o si debería seguir editando la pregunta original? ¿Cuál es más útil?
Sí, tiene razón en que este código es como beber de una manguera contra incendios. Desafortunadamente, debería haber escrito más sobre la manguera conectada a este código. Estoy enviando comandos de <10 bytes (con <10 respuestas de bytes) a 10 Hz. Esperaría más de suficiente buffer de lectura/escritura de 2-4K. Además, estoy viendo fallas en el primer comando. Así que, aunque sé que este código no se adapta a transferencias de datos más grandes/más rápidas, tengo curiosidad de por qué no funcionó con transferencias pequeñas/lentas. Perdón por no ser más claro. – GrandAdmiral
De acuerdo, debería funcionar. Por favor sea explícito sobre "Estoy viendo fallas". –
Claro. Digamos que mi comando es de cuatro bytes: 0x01 0x02 0x3 0x4. El dispositivo en COM X envía el comando. Puedo ver que el programa C# recibe cuatro bytes y los envía al dispositivo en COM Y. El dispositivo en COM Y recibe dos bytes: 0x01 0x03. Sé que el dispositivo en COM Y es confiable, así que me pregunto cómo se eliminaron los dos bytes. – GrandAdmiral