Estoy desarrollando un programa que necesita interactuar con los puertos COM.SerialPort que no recibe ningún dato
Al aprender de esto Q & A: .NET SerialPort DataReceived event not firing, hago mi código así.
namespace ConsoleApplication1
{
class Program
{
static SerialPort ComPort;
public static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args)
{
string data = ComPort.ReadExisting();
Console.Write(data.Replace("\r", "\n"));
}
static void Main(string[] args)
{
string port = "COM4";
int baud = 9600;
if (args.Length >= 1)
{
port = args[0];
}
if (args.Length >= 2)
{
baud = int.Parse(args[1]);
}
InitializeComPort(port, baud);
string text;
do
{
String[] mystring = System.IO.Ports.SerialPort.GetPortNames();
text = Console.ReadLine();
int STX = 0x2;
int ETX = 0x3;
ComPort.Write(Char.ConvertFromUtf32(STX) + text + Char.ConvertFromUtf32(ETX));
} while (text.ToLower() != "q");
}
private static void InitializeComPort(string port, int baud)
{
ComPort = new SerialPort(port, baud);
ComPort.PortName = port;
ComPort.BaudRate = baud;
ComPort.Parity = Parity.None;
ComPort.StopBits = StopBits.One;
ComPort.DataBits = 8;
ComPort.ReceivedBytesThreshold = 9;
ComPort.RtsEnable = true;
ComPort.DtrEnable = true;
ComPort.Handshake = System.IO.Ports.Handshake.XOnXOff;
ComPort.DataReceived += OnSerialDataReceived;
OpenPort(ComPort);
}
public static void OpenPort(SerialPort ComPort)
{
try
{
if (!ComPort.IsOpen)
{
ComPort.Open();
}
}
catch (Exception e)
{
throw e;
}
}
}
}
Mi problema es que el evento DataReceived nunca se activa.
Mis especificaciones del programa son:
- Sólo .net programación de la consola
- utilizo VSPE de http://www.eterlogic.com
- Mi equipo tiene puertos COM1 y COM2 ya.
- Creé COM2 y COM4 utilizando VSPE.
- me sale resultado de la salida de mystring serie (COM1, COM2, COM3, COM4)
Pero todavía no sé por qué DataReceived
evento no se dispara.
Actualizado
Por desgracia, todavía no podía hacer para disparar DataReceived
caso de ninguna manera.
Por lo tanto, he creado un nuevo proyecto con la esperanza de que enfrentaré una forma de resolverlo.
En ese nuevo proyecto [acaba de aplicación de consola], he creado una clase ...
public class MyTest
{
public SerialPort SPCOM4;
public MyTest()
{
SPCOM4 = new SerialPort();
if(this.SerialPortOpen(SPCOM4, "4"))
{
this.SendToPort(SPCOM4, "com test...");
}
}
private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)
{
bool blnOpenStatus = false;
try
{
objCom.PortName = "COM" + portName;
objCom.BaudRate = 9600;
objCom.DataBits = 8;
int SerParity = 2;
int SerStop = 0;
switch (SerParity)
{
case 0:
objCom.Parity = System.IO.Ports.Parity.Even;
break;
case 1:
objCom.Parity = System.IO.Ports.Parity.Odd;
break;
case 2:
objCom.Parity = System.IO.Ports.Parity.None;
break;
case 3:
objCom.Parity = System.IO.Ports.Parity.Mark;
break;
}
switch (SerStop)
{
case 0:
objCom.StopBits = System.IO.Ports.StopBits.One;
break;
case 1:
objCom.StopBits = System.IO.Ports.StopBits.Two;
break;
}
objCom.RtsEnable = false;
objCom.DtrEnable = false;
objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;
objCom.Open();
blnOpenStatus = true;
}
catch (Exception ex)
{
throw ex;
}
return blnOpenStatus;
}
private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)
{
try
{
int STX = 0x2;
int ETX = 0x3;
if (objCom.IsOpen && strText != "")
{
objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));
}
}
catch (Exception ex)
{
throw ex;
}
return true;
}
}
No estoy seguro de que me enfrento a la buena suerte o mala suerte ya que esta nueva clase podría hacer fuego DataReceived
evento que es de una aplicación de consola anterior que aún se está ejecutando. Para mí es un milagro que no tengo idea de cómo sucede esto.
Déjame contarte más detalles para que puedas darme una sugerencia de una mejor manera.
- Finalmente creé 2 proyectos de consola.
- El primer proyecto es la clase que publiqué ayer como pregunta.
- El segundo proyecto es la clase llamada MyTest que podría generar el evento de incendio
DataReceived
del primer proyecto, al mismo tiempo cuando se ejecutan dos proyectos.
¿Alguien podría darme sugerencias sobre cómo podría combinar estos dos proyectos como un solo proyecto?
IIRC 'DataReceived' se activa después de recibir un separador de línea. ¿Puedes confirmar que el dispositivo efectivamente está enviando varias líneas? – leppie
@leppie: IIRC, se dispara después de recibir más de (o al menos) bytes 'ReceivedBytesThreshold'. Entonces las preguntas son: 1. ¿Cuántos bytes estás recibiendo? 2. ¿Logró leer esta información usando una aplicación de terminal diferente? – Groo
@Groo: Gracias, parece más intuitivo :) – leppie