C# SerialPort未接收任何数据

C# SerialPort未接收任何数据,c#,serial-port,C#,Serial Port,我正在开发需要与COM端口交互的程序 通过从这个问答中学习,我的代码就是这样 namespace ConsoleApplication1 { class Program { static SerialPort ComPort; public static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args) { string data =

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

通过从这个问答中学习,我的代码就是这样

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事件从未被触发

我的程序规范是:

  • 只是.net控制台编程
  • 我使用来自的VSPE
  • 我的电脑已经有COM1和COM2端口了
  • 我使用VSPE创建了COM2和COM4
  • 我从mystring数组(COM1、COM2、COM3、COM4)获得输出结果
  • 但我仍然不知道为什么没有触发
    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;
        }
    }
    
    我不确定我是否会遇到好运或厄运,因为这个新类可能会引发fire
    DataReceived
    事件,该事件来自仍在运行的旧控制台应用程序。这对我来说是个奇迹,我不知道这是怎么发生的

    让我告诉你们更多的细节,以便你们能给我更好的方法的建议

  • 最后,我创建了2个控制台项目
  • 第一个项目是我昨天作为问题发布的课程
  • 第二个项目是名为MyTest的类,它可以使fire
    DataReceived
    事件从第一个项目接收,同时运行两个项目

  • 有谁能给我一些建议,告诉我如何将这两个项目合并为一个项目吗?

    我从未与VSPE合作过,所以我不确定这是否会导致问题。我以前使用过COM端口,我查找过我的代码。唯一的主要区别是声明事件的方式。你有:

    ComPort.DataReceived += OnSerialDataReceived;
    
    我是这样的:

    ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
    

    OnSerialDataReceived是您的事件处理程序。我不确定这是否会有什么不同,但你可以试试。我希望这有帮助

    我从未使用过VSPE,因此我不确定这是否会导致问题。我以前使用过COM端口,我查找过我的代码。唯一的主要区别是声明事件的方式。你有:

    ComPort.DataReceived += OnSerialDataReceived;
    
        ComPort.Handshake = Handshake.None;
    
    我是这样的:

    ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
    
    OnSerialDataReceived是您的事件处理程序。我不确定这是否会有什么不同,但你可以试试。我希望这有帮助

        ComPort.Handshake = Handshake.None;
    
    问题不是DataReceived事件没有触发,而是串行端口没有接收任何数据。很少有串行设备完全不用握手。如果将其设置为“无”,则驱动程序将不会打开DTR(数据终端就绪)和RTS(发送请求)信号。串行端口设备将其解释为“机器已关闭(DTR)”或“机器未准备好接收数据(RTS)”。所以它不会发送任何信息,也不会触发DataReceived事件

    如果确实不需要,则将DTREnable和RTSEnable属性设置为true。但您可能希望HandShake.RequestToSend,因为设备似乎在关注握手信号

    如果仍然有问题,请使用其他串行端口程序,如Putty或HyperTerminal,以确保连接和通信参数良好,设备响应良好。SysInternals的PortMon实用程序提供了驱动程序交互的低级视图,因此您可以比较好与坏

    问题不是DataReceived事件没有触发,而是串行端口没有接收任何数据。很少有串行设备完全不用握手。如果将其设置为“无”,则驱动程序将不会打开DTR(数据终端就绪)和RTS(发送请求)信号。串行端口设备将其解释为“机器已关闭(DTR)”或“机器未准备好接收数据(RTS)”。所以它不会发送任何信息,也不会触发DataReceived事件

    如果确实不需要,则将DTREnable和RTSEnable属性设置为true。但您可能希望HandShake.RequestToSend,因为设备似乎在关注握手信号


    如果仍然有问题,请使用其他串行端口程序,如Putty或HyperTerminal,以确保连接和通信参数良好,设备响应良好。SysInternals的PortMon实用程序提供了驱动程序交互的低级视图,因此您可以比较好与坏。

    我也遇到了类似的问题。在一个图形应用程序(C#win表单)中,我有一个类,它封装了一个
    SerialPort
    组件。
    DataReceived
    事件只触发了一次,但随后收到的任何数据都没有触发任何事件。我通过调用主体形式
    Closed
    事件函数中的
    Close
    方法解决了这个问题。
    不知道为什么这会改变什么,但现在它起作用了。

    我也遇到了类似的问题。在一个图形应用程序(C#win表单)中,我有一个类,它封装了一个
    SerialPort
    组件。
    DataReceived
    事件只触发了一次,但随后收到的任何数据都没有触发任何事件。我通过调用主体形式
    Closed
    事件函数中的
    Close
    方法解决了这个问题。
    不知道为什么这会改变什么,但现在它工作了。

    IIRC
    DataReceived
    在接收到行分隔符后被激发。你能确认设备确实发送了多行吗?@leppie:IIRC,它在收到超过(或至少)个
    ReceivedBytesThreshold
    字节后触发。所以问题是:1。您正在接收多少字节?2.您是否使用其他终端应用程序成功读取了此数据?@Groo:谢谢,这似乎更直观:)ComPort.DataReceived+=new SerialDataReceivedEventHandler(OnSerialDataReceived)@赛巴尔:你的评论有什么意义?IIRC
    DataReceived
    在收到行分隔符后被触发。你能确认设备确实在发送多条线路吗?@leppie:IIRC,它会触发一个