C# 串行通信 DLL

Posted

技术标签:

【中文标题】C# 串行通信 DLL【英文标题】:C# Serial Communication DLL 【发布时间】:2020-04-21 08:59:08 【问题描述】:

我正在 DLL 中开发串行通信协议。我有一个关于这个问题的课程,在那里我用不同的方法分开:

    打开串行通信。 写入和读取数据(到 PLC)。 关闭串行通信。

从使用 DLL 的项目中,我可以打开和关闭串行通信,但是当我使用 write 时,事件处理程序永远不会激活。我不明白为什么。我尝试开发代码以在一个单独的项目(没有 DLL)中测试串行通信,它工作正常,我可以与 PLC 通信。所以我认为可能是我必须让 DLL 保持活动状态,我使用了一些计时器但它不起作用。

DLL 中的串行类:

            public class Serial
            
             SerialPort com = new SerialPort(GlobalData.PLC_ADDRESS, 9600, Parity.None, 8, StopBits.One);

              public void Open()
                
                  // Read event handler
                    com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);

                    // Set the read/write timeouts
                    com.ReadTimeout = 400;
                    com.WriteTimeout = 400;
                    // Open the port for communication.
                    com.Open();
    

           public void Talk2PLC()
            
                byte[] cmd =  17, 3, 0, 64, 0, 100, 71, 101;
                com.Write(cmd, 0, cmd.Length);
    


        public void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        
 Console.WriteLine($"Inside com_DataReceived");

            // Buffer and process binary data
            while (com.BytesToRead > 0)
                PlcBuffer.Add((byte)com.ReadByte());

        public void Close()
        
                // Close the port
                com.Close();


    

从使用这种方法的 DLL 的项目中,我首先调用 Open(),然后调用 Talk2PLC。

我还在DLL中使用了“IsOpen”来检查端口是否打开,我没有复制这里以获得更清晰的代码。

代码进入“com_DataReceived(...)”应该怎么做?我写了一个 Console.WriteLine(..) 来检查它什么时候进入。

【问题讨论】:

【参考方案1】:

我用三菱试了没发现问题,可以在com.Open()之前让com.DtrEnable = true

【讨论】:

以上是关于C# 串行通信 DLL的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?

C# COM 端口通信 - USB 到串行适配器的错误

如何在 C# 中实现串行端口通信以控制现金存款机 [关闭]

C#串口介绍及串口通信程序设计实现(附程序分享)

C#开发串口通信实例及串口基础

串行通信写入