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".