SerialPort no recibe ningún dato

Estoy desarrollando un progtwig que necesita interactuar con los puertos COM.

Al aprender de esta sesión de preguntas y respuestas: el evento .NET SerialPort DataReceived no se activa , configuro 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 dispara.

Las especificaciones de mi progtwig son:

  1. Progtwigción de la consola Just .net
  2. Yo uso VSPE desde http://www.eterlogic.com
  3. Mi computadora ya tiene puertos COM1 y COM2.
  4. Creé COM2 y COM4 usando VSPE.
  5. Obtengo el resultado de salida de la matriz de mystring (COM1, COM2, COM3, COM4)

Pero todavía no sé por DataReceived evento DataReceived no se DataReceived .


Actualizado

Desafortunadamente, todavía no pude disparar el evento DataReceived de ninguna manera.

Entonces, creé un proyecto nuevo con la esperanza de enfrentar una forma de resolverlo.

En ese nuevo proyecto [solo aplicación de consola], creé 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 tenga buena suerte o mala suerte porque esta nueva clase podría DataReceived evento DataReceived fuego que proviene 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.

  1. Finalmente, creé 2 proyectos de consola.
  2. El primer proyecto es la clase que publiqué ayer como pregunta.
  3. El segundo proyecto es la clase llamada MyTest que podría hacer que el evento DataReceived del primer proyecto, al mismo tiempo cuando se ejecutan dos del proyecto.

¿Alguien podría darme sugerencias sobre cómo podría combinar estos dos proyectos como un solo proyecto?

  ComPort.Handshake = Handshake.None; 

El problema no es que el evento DataReceived no se active, el problema es que el puerto serie no está recibiendo ningún dato. Hay muy, muy pocos dispositivos seriales que no usan ningún tipo de apretón de manos. Si lo configura en Ninguno, el controlador no encenderá las señales DTR (Data Terminal Ready) y RTS (Request To Send). Lo que un dispositivo de puerto serie interpreta como “la máquina está apagada (DTR)” o “la máquina no está lista para recibir datos (RTS)”. Por lo tanto, no enviará nada y su evento DataReceived no se activará.

Si realmente quiere Ninguno, establezca las propiedades DTREnable y RTSEnable en verdadero. Pero es probable que desee HandShake.RequestToSend ya que el dispositivo parece estar prestando atención a las señales de handshake.

Si aún tiene problemas, utilice otro progtwig de puerto en serie como Putty o HyperTerminal para asegurarse de que los parámetros de conexión y comunicación sean buenos y el dispositivo responda. La utilidad PortMon de SysInternals ofrece una vista de bajo nivel de la interacción del controlador para que pueda comparar lo bueno contra lo malo.

Nunca he trabajado con VSPE, así que no estoy seguro de si eso causa el problema. He trabajado con un puerto COM antes y busqué mi código. La única diferencia principal es la forma en que declaras el evento. Tienes:

 ComPort.DataReceived += OnSerialDataReceived; 

Lo tengo así:

 ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived); 

OnSerialDataReceived es tu controlador de eventos. No estoy seguro de si esto hará alguna diferencia, pero puedes intentarlo. ¡Espero que esto ayude!

Tuve un problema bastante similar. En una aplicación gráfica (formulario C # win) tuve una clase que encapsula un componente SerialPort. El evento de datos recibidos solo se activaba una vez, luego los siguientes envíos de datos no desencadenaron ningún evento. Resolví el problema llamando al método SerialPort.Close () en mi función principal de evento Cerrado. No tengo idea de por qué eso cambia nada, pero ahora está funcionando.

“Espero que esto pueda ayudar …