连接到套接字时,.NET SerialPort被阻止

时间:2018-09-12 07:50:40

标签: c# .net serial-port tcpclient

.NET中的SerialPort类有问题。

使用下面的代码连接到它时,它可以正常工作。但是,如果我同时通过TcpClient对象连接到TCP / IP设备,那么SerialPort.DataReceived永远不会触发?

下面是我使用的代码示例。

...

public void Initialize()
{
    try
    {
        this.SerialPort = new SerialPort(this.portname, this.baudrate, this.parity);
        if (!this.SerialPort.IsOpen)
        {
            this.SerialPort.Open();
        }

        this.SerialPort.DataReceived += SerialPort_DataReceived;
    }
    catch (Exception ex)
    {
        ...
    }
}

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if(!this.isrunning)
    {
        return;
    }

    try
    {
        int count = this.SerialPort.Read(this.buffer, 0, this.buffer.Length);
        var data = new byte[count];
        Array.Copy(this.buffer, data, count);
        this.binarywriter.Write(data);
    }
    catch (Exception ex)
    {
        ...
    }
}

...

注意

  • 任何时候都不会引发异常。

  • 未连接TcpClient时,将触发DataReceived事件,而在TcpClient连接时,则不会触发该事件。

1 个答案:

答案 0 :(得分:0)

问题在于,连接TcpClient代码时,此标志this.isrunning是由TcpClient代码设置的。如果时间太长,SerialPort.DataReceived将停止触发。

解决方案是通过调用this.SerialPort.DiscardInBuffer()

来修改代码。
    if(!this.isrunning)
    {
        this.SerialPort.DiscardInBuffer();
        return;
    }

所以我假设某个地方发生了某种缓冲区溢出,但是我从未收到任何异常,该事件只是停止触发。