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

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

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

从使用 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(..) 来检查它什么时候进入。

【问题讨论】:

    标签: c# dll serial-port


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多