【发布时间】: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(..) 来检查它什么时候进入。
【问题讨论】:
标签: c# dll serial-port