.NET SerialPort 在连接到套接字时被阻塞
.NET SerialPort is blocked when connected to socket
我在 .NET 中遇到 SerialPort class 问题。
使用以下代码连接到它时,它按预期工作。但是如果我同时通过 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连接时不触发事件
问题是这个标志 this.isrunning 是在连接时由 TcpClient 代码设置的。如果这花费的时间太长,SerialPort.DataReceived 将停止触发。
解决方案是通过调用 this.SerialPort.DiscardInBuffer()
来修改代码
if(!this.isrunning)
{
this.SerialPort.DiscardInBuffer();
return;
}
所以我假设某处发生了某种缓冲区溢出,但我从未遇到过任何异常,事件只是停止触发。
我在 .NET 中遇到 SerialPort class 问题。
使用以下代码连接到它时,它按预期工作。但是如果我同时通过 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连接时不触发事件
问题是这个标志 this.isrunning 是在连接时由 TcpClient 代码设置的。如果这花费的时间太长,SerialPort.DataReceived 将停止触发。
解决方案是通过调用 this.SerialPort.DiscardInBuffer()
来修改代码 if(!this.isrunning)
{
this.SerialPort.DiscardInBuffer();
return;
}
所以我假设某处发生了某种缓冲区溢出,但我从未遇到过任何异常,事件只是停止触发。