Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 什么会影响Serialport.Read()返回的值_.net_Serial Port - Fatal编程技术网

.net 什么会影响Serialport.Read()返回的值

.net 什么会影响Serialport.Read()返回的值,.net,serial-port,.net,Serial Port,我在C#2.0中编写了一个简单的应用程序,使用.Net Framework 2.0 Serialport类通过COM1与控制器卡通信 最近发生的一个问题是读取方法返回的字节不正确。它返回了正确的字节数,只是值不正确。不过,用Delphi编写的类似应用程序仍然返回了正确的值 我曾经在两个应用程序的串行端口上记录活动,比较两个日志,在那里有一些(显然)细微的不同设置,我尝试尽可能地模仿Delphi应用程序,但没有效果 那么,什么会影响Read方法返回的字节值呢 两个应用之间的大多数设置是相同的 以下

我在C#2.0中编写了一个简单的应用程序,使用.Net Framework 2.0 Serialport类通过COM1与控制器卡通信

最近发生的一个问题是读取方法返回的字节不正确。它返回了正确的字节数,只是值不正确。不过,用Delphi编写的类似应用程序仍然返回了正确的值

我曾经在两个应用程序的串行端口上记录活动,比较两个日志,在那里有一些(显然)细微的不同设置,我尝试尽可能地模仿Delphi应用程序,但没有效果

那么,什么会影响Read方法返回的字节值呢

两个应用之间的大多数设置是相同的

以下是Portmon日志中不同的行的列表:

Delphi应用程序:

IOCTL_SERIAL_SET_CHAR Serial0成功EOF:dc 错误:0 BRK:0EVT:0XON:11 XOFF:13
IOCTL\ U串行\设置\手流串行0成功抖动:0 替换:0256 XoffLimit:256IOCTL\u SERIAL\u SET\u timeout Serial0 SUCCESS RI:-1 RM:100RC:1000WM:100WC:1000 IOCTL\u序列\u设置\u等待\u掩码序列0成功掩码: RXCHAR RXFLAGTXEMPTYCTS DSR RLSD BRK错误环RX80FULL

C#应用程序:

IOCTL_SERIAL_SET_CHAR Serial0成功EOF:1a 错误:0 BRK:0EVT:1aXON:11 XOFF:13 IOCTL\ U串行\设置\手流串行0成功抖动:0 替换:01024 XoffLimit:1024IOCTL\u SERIAL\u SET\u timeout Serial0 SUCCESS RI:-1 RM:-1RC:1000WM:0WC:1000 IOCTL\u序列\u设置\u等待\u掩码序列0成功掩码: RXCHAR RXFLAG CTS DSR RLSD BRK ERR 戒指

更新:

正确返回的字节是:91、1、1、3、48、48、50、69、66、51、70、55、52、93(14个字节)。 最后一个值是简单的校验和

返回的错误值为:91、241、254、252、242、146、42、201、51、70、55、52、93(13个字节)

正如您所看到的,返回的第一个和最后五个字节是对应的


ErrorReceived事件表示发生了帧错误,这可以解释错误的值。但问题是,当Delphi应用程序显然没有遇到帧错误时,为什么SerialPort会遇到帧错误?

您是否检查了数据位数、停止位数和奇偶校验的设置


奇偶校验位是一种错误检测机制。例如:如果使用7个数据位和一个奇偶校验位发送,则第八位将用于检测位反转错误。如果接收器需要8个数据位,而没有奇偶校验位,则结果将是混乱的。

不幸的是,您没有确切说明您得到的差异类型。这是一个偶然的不同字符,还是所有传入的数据都被篡改了?
请注意,通过SerialPort.read函数读取的字符可能会因属性的设置而被系统更改。此设置影响传入文本的解释,因为它是ASCII、Unicode、UTF8或Windows用于“原始字节”到“可读文本”转换的任何其他编码方案中的文本

如果您正在读取字节数组(例如:SerialPort.Read),您应该准确地获得您在PortMon上看到的字节

如果要转换为字符(SerialPort.ReadLine或SerialPort.ReadChar),则数据将使用当前编码(SerialPort.encoding属性)进行编码,这解释了您看到的差异

如果希望看到与线路上的字节具有相同二进制值的字符,可以使用拉丁-1编码,如中所述

例如:

SerialPort.Encoding = Encoding.GetEncoding("Latin1")

看来问题已经解决了(至少目前是这样)

显然,帧错误导致返回不正确的值。我使用MSComm控件编写了一个VB6应用程序,该控件运行良好,并比较了Portmon生成的日志文件

我发现了以下差异

VB6应用程序:

IOCTL\ U串行\设置\手流串行0 成功抖动:1替换:0 XonLimit:256 XoffLimit:256

C#应用程序:

IOCTL\ U串行\设置\手流串行0 成功抖动:0替换:0 XonLimit:1024 XoffLimit:1024

我发现如果我设置
\u serialPort.DtrEnable=true
C#应用程序生成以下日志条目:

IOCTL\ U串行\设置\手流串行0 成功抖动:1替换:0 XonLimit:1024 XoffLimit:1024


这似乎可以防止帧错误,并且应用程序似乎工作正常。

除了正确的数据外,您还可以提供一些错误数据的示例。如果我们能看到什么是不正确的,我们也许能猜到问题所在。我还认为可能是编码,因为IOCTL_SERIAL_SET_CHAR设置略有不同,我认为这可能与编码有关。但是,既然返回值是字节,编码又如何影响它呢?你能举个例子吗?啊,对不起,我应该检查一下自己。我发现编码可能会影响用于表示单个字符的字节数。我对编码进行了尝试,但收效甚微。我现在使用ReadByte()来避免任何可能的编码问题。无论如何,谢谢你有趣的建议。