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的主要内容,如果未能解决你的问题,请参考以下文章