我正在开发需要与COM端口交互的程序。
通过从以下问答中了解到:.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事件永远不会触发。
我的程序规格为:
但是我仍然不知道为什么DataReceived事件没有被触发。
DataReceived
不幸的是,我仍然无法DataReceived以任何方式触发事件。
因此,我希望能够解决问题,从而创建了一个新项目。
在这个新项目[只是控制台应用程序],我创建了一个类…
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事件,该事件来自仍在运行的旧版控制台应用程序。我不知道这是怎么回事,这对我来说是个奇迹。
让我告诉您更多细节,以便您可以提出更好的建议。
谁能给我建议,我如何将这两个项目合并为一个项目?
ComPort.Handshake = Handshake.None;
问题不在于没有触发DataReceived事件,而是串口没有接收任何数据。很少有完全不使用握手的串行设备。如果将其设置为None,则驱动程序将不会打开DTR(数据终端就绪)和RTS(请求发送)信号。哪个串行端口设备解释为“计算机已关闭(DTR)”或“计算机尚未准备好接收数据(RTS)”。因此,它将不会发送任何内容,并且不会触发您的DataReceived事件。
如果您 真的 想要无,则将DTREnable和RTSEnable属性设置为true。但是您可能需要HandShake.RequestToSend,因为设备似乎正在注意握手信号。
如果仍然有问题,请使用其他串口程序(例如Putty或HyperTerminal)来确保连接和通信参数良好并且设备可以响应。SysInternals的PortMon实用程序提供了驱动程序交互的低级视图,因此您可以比较好坏。