visual studio serialport1_datareceived serialport serialdatareceivedeventargs serial received example event data application c# serial-port

c# - serialport1_datareceived - visual studio system io ports



SerialPort.DataReceived Devolución de resultados extraños (1)

Actualmente estoy trabajando con un dispositivo llamado Fluke 5500A Dispositivo de Calibración de Producto Múltiple. He escrito un pequeño programa en C # para interactuar con él y aprender más sobre cómo funciona, pero desafortunadamente SerialPort.DataReceived me está dando algunos resultados muy extraños. El programa no es largo, así que voy a publicarlo en su totalidad aquí:

class Program { static public bool isExecuting = true; static private string serialCommand; static private string dataReceived; static void Main(string[] args) { SerialPortConnection serialPort = new SerialPortConnection(); serialPort.OpenSerialConnection(); while (isExecuting == true) { Console.WriteLine("Enter a command or type q to quit."); serialCommand = Console.ReadLine().ToUpper(); if (serialCommand == "Q") isExecuting = false; else if (serialCommand == "CLEAR") Console.Clear(); else { dataReceived = serialPort.WriteSerialConnection(serialCommand); Console.WriteLine(dataReceived); } } serialPort.CloseSerialConnection(); } }

}

Y mi clase SerialPortConnection:

public class SerialPortConnection { private SerialPort serialPort; private string dataReceived = "none"; public SerialPortConnection(string comPort = "Com3", int baud = 9600, System.IO.Ports.Parity parity = System.IO.Ports.Parity.None, int dataBits = 8, System.IO.Ports.StopBits stopBits = System.IO.Ports.StopBits.One) { serialPort = new SerialPort(comPort, baud, parity, dataBits, stopBits); } public void OpenSerialConnection() { try { serialPort.Open(); } catch (Exception e) { Console.Write("/nError"); Console.Write(e); } } public string WriteSerialConnection(string SerialCommand) { try { serialPort.Write(String.Format(SerialCommand + "/r")); dataReceived = serialPort.ReadExisting(); return dataReceived; } catch (Exception e) { Console.Write("/nError"); Console.Write(e); return "Execution Unsuccessful"; } } public void CloseSerialConnection() { try { serialPort.Close(); } catch (Exception e) { Console.Write("/nError"); Console.Write(e); } } }

Mi problema actualmente es que el resultado de la consola se ve así:

Enter a command or type q to quit. *IDN? Enter a command or type q to quit. OUT 50V <-- Command input *IDN? <-- Previous command echoed back FLUKE,5500A,8030005,2.61+1.3+2.0+* <-- Data received from previous command 161> Enter a command or type q to quit. OPER OUT 50V 162> Enter a command or type q to quit. STBY OPER 163> Enter a command or type q to quit. *RST STBY 164> Enter a command or type q to quit.

Los comandos se ejecutan bien, pero el resultado de la consola parece ser el último comando que se ejecutó y los datos devueltos por ese comando. No sé por qué podría ser esto.

EDITAR:

Gracias a la respuesta de Robert P implementé el siguiente código:

var received = ""; bool isReading = true; while (isReading == true) { try { received += serialPort.ReadExisting(); if (received.Contains(''>'')) isReading = false; } catch (Exception e) { } } Console.WriteLine(received);


Una parte de su problema es que la comunicación serial está lejos de ser instantánea. El método .ReadExisting() extrae datos del búfer del objeto SerialPort , pero no hace nada para garantizar que el dispositivo haya terminado de emitir su comando. Piensa en esto, de esta manera:

+----+ +----------+ +------------+ |Your|--Command-->|Serial |---UART--->| Device | |Code| |Port Obj | | | +----+ +----------+ +------------+ +----+ +----------+ +------------+ |Your|<--Read-----|Serial | |Device | |Code| (is empty) | | |(processing)| +----+ +----------+ +------------+ +----+ +----------+ +------------+ |Your| |Serial |<-response-|Device | |Code| |(has data)| |(responding)| +----+ +----------+ +------------+ +----+ +----------+ +------------+ |Your|--Command2->|Serial |---UART--->| Device | |Code| |(has data)| | | +----+ +----------+ +------------+ +----+ +----------+ +------------+ |Your|<--Read-----|Serial | |Device | |Code| (previous | | |(processing)| +----+ response) +----------+ +------------+

En su lugar, busque un patrón, token u otra marca de identificación para saber que la transmisión se ha completado ANTES de enviar el siguiente comando. Continúe leyendo (espere tiempos de espera - ¡son lanzados como una excepción!) Hasta que sepa que recibió la respuesta completa. En este caso, es posible que el carácter > represente "listo para recibir más información". Puede interpretar que también significa "La respuesta está completa".