SerialPort没有收到任何数据

我正在开发需要与COM端口交互的程序。

通过从这个Q&A学习: .NET的SerialPort DataReceived事件不会触发 ,我做我的代码。

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; } } } } 

我的问题是DataReceived事件永远不会被解雇。

我的程序规格是:

  1. 只需.net控制台编程
  2. 我使用http://www.eterlogic.com的 VSPE
  3. 我的电脑已经有COM1和COM2端口。
  4. 我使用VSPE创build了COM2和COM4。
  5. 我从mystring数组(COM1,COM2,COM3,COM4)

但是我仍然不知道为什么DataReceived事件没有被触发。


更新

不幸的是,我仍然无法以任何方式触发DataReceived事件。

所以我创造了一个新的项目,希望我会面对一个解决的方法。

在新的项目[只是控制台应用程序],我创build了一个类…

 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; } } 

我不确定我是否面临好运或者运气不好,因为这个新类可能会使得仍然在运行的旧控制台应用程序触发DataReceived事件。 我不知道如何发生这是奇迹。

让我告诉你更多的细节,以便你可以给我更好的方法build议。

  1. 最后我创build了2个控制台项目。
  2. 第一个项目是我昨天发布的一个问题。
  3. 第二个项目是名为MyTest的类,它可以在第一个项目中启动DataReceived事件,同时当两个项目正在运行时。

任何人都可以给我build议如何将这两个项目作为一个单一的项目?

  ComPort.Handshake = Handshake.None; 

问题不在于DataReceived事件不会触发,问题是串行端口没有收到任何数据。 有很less的串口设备根本不使用握手。 如果将其设置为None,那么驱动程序将不会打开DTR(数据terminal就绪)和RTS(请求发送)信号。 哪一个串口设备解释为“机器closures(DTR)”或“机器没有准备好接收数据(RTS)”。 所以它不会发送任何东西,您的DataReceived事件不会触发。

如果你真的想要None,那么将DTREnable和RTSEnable属性设置为true。 但是很可能你需要HandShake.RequestToSend,因为设备似乎注意到了握手信号。

如果仍然有问题,请使用另一个串口程序,如Putty或HyperTerminal,以确保连接和通信参数良好,并且设备响应。 SysInternals的PortMon实用程序提供了一个低级别的驱动程序交互视图,所以你可以比较好与坏。

我从来没有使用过VSPE,所以我不确定是否会导致问题。 之前我曾经使用过一个COM端口,并且查找了我的代码。 唯一的主要区别是你声明事件的方式。 你有:

 ComPort.DataReceived += OnSerialDataReceived; 

我有这样的:

 ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived); 

OnSerialDataReceived是你的事件处理程序。 我不确定这是否会有所作为,但可以尝试。 我希望这有帮助!

我有一个相当类似的问题。 在一个graphics应用程序(C#win窗体)中,我有一个类封装了一个SerialPort组件。 数据接收事件只发射一次,然后下面的数据发送没有发生任何事件。 我通过调用我的主体formsClosed事件函数中的SerialPort.Close()方法解决了这个问题。 不知道为什么这会改变什么,但现在它正在工作。

“希望这可以帮助…