- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的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.
我正在处理二进制数据。什么是“文件结束字符”?
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/
读取文件时,我知道提供的最后一个字符是 EOF。现在,当我有 EOF 时会发生什么?该文件中的字符? 如何区分文件的“真实”结尾和 EOF特点? 最佳答案 我决定将我的评论移至答案。 您的文件中不能有
GNU Bash - 3.6.6 Here Documents [n]<<[-]word here-document delimiter If any part of word is
试图查看论坛但无法重新访问。 我正在尝试阅读文本。文字是:“给 b” 但是在使用 fgetc() 时,没有达到 EOF,最后我得到 '\n',然后是无穷大的 'y' 样本。 这是我的代码: Node*
我正在做一个非常简单的作业,需要输出文件的内容,但在做任何事情之前我意外地到达了 EOF。该文件仅包含单词“pig”,并且由于某种原因 EOF 返回 16。我正在使用 Dev-Cpp 并且该程序是用
我的 kubectl 无法读取文件,每次都返回 'error: unexpected EOF'。 kubectl apply -f service.yaml > error: unexpected E
我想知道什么时候使用 cat Hello world! () { setopt localoptions shnullcmd test-nullcmd } # nothing will be
我试图找出我正在向其中写入特定数据的文件中不需要的尾随结束数据的原因,并且不相信我在写入文件时出错。 输出如下: building room_numbr capacity packard
考虑下面的简单例子 #include #include #include using namespace std; int main() { string str = "string";
我在一个程序中有这个片段(在 Visual Studio 2005 中): if(_eof(fp->_file)) { break; } 当达到 eof 时,它打破了封闭循环。但是程序无法解析
我正在尝试为 Typed Racket 中的以下函数定义类型注释: (define (neof x) (if (eof-object? x) #f x)) 不加注释给出了类型: (Any ->
我正在为 Linux 构建系统的模块编写 .spec 文件,遇到一个小问题并想分享它。 用于编写脚本文件: cat /path/to/somewhere/script #blah blah EOF
我有一个 C++ 程序,它从一个文件中读取我希望有一堆格式相同的记录。如果遇到意外情况,无论是记录格式不正确还是输入失败,我都想停止阅读,我想区分这些不同的情况。 我看过 this answer并查看
我注意到它们之间的几个区别: 在 <
预期我正在生成子进程并执行“ssh”远程框。从最近几天开始它工作正常,现在突然间,每当我尝试生成子进程时,它都会抛出错误。不确定发生了什么。 直到现在我一直在使用 pexpect 3.1,我遇到了这个
这个问题已经有答案了: Why two EOF needed as input? [duplicate] (2 个回答) Why do I require multiple EOF (CTRL+Z)
我正在浏览一个文件来寻找特定的词 Char[50]=getline(file,/n) 使用 getline 将每一行存储到一个 char 数组中以与我要查找的字符串进行比较 If( “”==char[
引用两个问题: Incorrect output from C++ Primer 1.4.4 Confused by control flow execution in C++ Primer exam
我刚刚在 this 中找到一条评论回答说在循环条件中使用 iostream::eof “几乎肯定是错误的”。我通常使用类似 while(cin>>n) 的东西——我猜它会隐式检查 EOF。 为什么使用
我刚刚在 this 中找到一条评论回答说在循环条件中使用 iostream::eof “几乎肯定是错误的”。我通常使用类似 while(cin>>n) 的东西——我猜它会隐式检查 EOF。 为什么使用
我刚刚在 this 中找到一条评论回答说在循环条件中使用 iostream::eof “几乎肯定是错误的”。我通常使用类似 while(cin>>n) 的东西——我猜它会隐式检查 EOF。 为什么使用
我是一名优秀的程序员,十分优秀!