gpt4 book ai didi

c# - SerialData.Eof情况

转载 作者:太空狗 更新时间:2023-10-29 17:48:25 27 4
gpt4 key购买 nike

在我的SerialPort.DataReceived事件处理程序,我正在检查 SerialData.Eof :

void DataReceived(object sender, SerialDataReceivedEventArgs e) {
if (e.EventType == SerialData.Eof)
throw new NotImplementedException("SerialData.Eof");
// ... Read
}

在我到目前为止的整个开发过程中,我从未遇到过这个异常。但是今天,在处理协议(protocol)的不同部分时,它成功了。

我的问题是,SerialData.Eof 到底是什么意思? MSDN 说:

The end of file character was received and placed in the input buffer.

我正在处理二进制数据。什么是“文件结束字符”?


MSDN Forum Post指出

the DCB.EofChar member always gets initialized to 0x1A (Ctrl+Z)

reference sources对于 SerialStream 类,在第 1343 行,我们确实看到了:

dcb.EofChar = NativeMethods.EOFCHAR;

Microsoft.Win32.NativeMethods 中:

internal const byte EOFCHAR = (byte) 26; 

那么这是否意味着只要我的设备发送一个 0x1A 字节,我就会收到一个 SerialData.Eof 事件?如果是这样,我是否应该完全停止测试?

最佳答案

我在那篇 MSDN 帖子中的原始分析是正确的。然而,引用源揭示了答案,来自 SerialStream.cs:

dcb.EofChar = NativeMethods.EOFCHAR;

//OLD MSCOMM: dcb.EvtChar = (byte) 0;
// now changed to make use of RXFlag WaitCommEvent event => Eof WaitForCommEvent event
dcb.EvtChar = NativeMethods.EOFCHAR;

呃,他们使用 DCB 的 EvtChar 设置来检测 Ctrl+Z。这是一个非常糟糕的主意,因为没有办法改变它,而且 0x1a 字节值肯定会出现在二进制协议(protocol)中。在实践中,这几乎总是有一个好的结局,因为当事件触发时会有一些东西可以阅读。尽管如此,现在有一个可以触发另一个 事件的竞争条件,这次是 SerialData.Chars,由于上一个事件导致读取所有字节,因此没有任何内容可读。这将使 Read() 调用阻塞,直到一个字节可用。这通常可行,但确实增加了 Close() 调用死锁的几率。一个长期的 SerialPort 问题。

正确的处理方式是:

void DataReceived(object sender, SerialDataReceivedEventArgs e) {
if (e.EventType == SerialData.Eof) return;
// ... Read
}

关于c# - SerialData.Eof情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483711/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com