我正在尝试使用 System.IO.Ports.SerialPort 类打开并读取串行端口。我将串行端口从工具窗格 (VS 2008) 拖到我的 Windows 窗体上。我已经设置了属性网格,因此我可以在运行时轻松更改串行端口的属性。当我尝试打开端口时,出现如下错误。我不明白为什么,因为我可以使用超级终端打开和读取端口。有任何想法吗?

System.IO.IOException Error connection: A device attached to the system is not functioning
   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   at System.IO.Ports.InternalResources.WinIOError()
   at System.IO.Ports.SerialStream.set_DtrEnable(Boolean value)
   at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
   at System.IO.Ports.SerialPort.Open()
   at Test.CardReader.frmMain.Connect() in D:\Develop\2.0\Projects\Kiosk\EmbeddedBrowser\Windows Forms\Test.CardReader\Form1.cs:line 166

请注意,这是一个USB连接,因此它是一个虚拟串行端口,我的设置如下:
波特率 = 9600
数据位 = 8
丢弃空值 = false
Dtr 启用 = false
握手=无
奇偶校验 = 无
奇偶校验替换 = 63
端口名称 = COM3
读取缓冲区大小 = 4096
读取超时 = -1
接收字节数 = 1
Trs启用 = 假
停止位 = 1
写入缓冲区大小 = 2048
写入超时 = -1

我从 sysinternals 下载了 PortMon。我捕获了 2 个日志,第一个是超级终端打开端口时发生的情况的日志,第二个是 .net SerialPort 类尝试打开端口时发生的情况:

超级终端:

IRP_MJ_CREATE                   USBSER000   SUCCESS         Options: Open 
IOCTL_SERIAL_SET_QUEUE_SIZE     USBSER000   SUCCESS         InSize: 8192 OutSize: 8192
IOCTL_SERIAL_CONFIG_SIZE        USBSER000   SUCCESS         Size: 0
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS         Rate: 9600
IOCTL_SERIAL_SET_RTS            USBSER000   SUCCESS 
IOCTL_SERIAL_SET_DTR            USBSER000   * 0xC0000001    
IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS         StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR           USBSER000   SUCCESS         EOF:1a ERR:0 BRK:0 EVT:1a XON:f6 XOFF:6
IOCTL_SERIAL_SET_HANDFLOW       USBSER000   SUCCESS         Shake:80000001 Replace:80000040 XonLimit:80 XoffLimit:200
IOCTL_SERIAL_SET_TIMEOUTS       USBSER000   SUCCESS         RI:10 RM:0 RC:0 WM:0 WC:5000
IOCTL_SERIAL_SET_WAIT_MASK      USBSER000   SUCCESS         Mask: RLSD ERR 
IOCTL_SERIAL_GET_MODEMSTATUS    USBSER000   SUCCESS 
IOCTL_SERIAL_WAIT_ON_MASK       USBSER000       
IRP_MJ_READ USBSER000                                       Length 80

.Net串口:

IRP_MJ_CREATE                   USBSER000   SUCCESS Options: Open 
IOCTL_SERIAL_GET_PROPERTIES     USBSER000   SUCCESS 
IOCTL_SERIAL_GET_MODEMSTATUS    USBSER000   SUCCESS 
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS Rate: 9600
IOCTL_SERIAL_CLR_RTS            USBSER000   SUCCESS 
IOCTL_SERIAL_CLR_DTR            USBSER000   * 0xC0000001    
IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR           USBSER000   SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW       USBSER000   SUCCESS Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS Rate: 9600
IOCTL_SERIAL_CLR_RTS            USBSER000   SUCCESS 
IOCTL_SERIAL_CLR_DTR            USBSER000   * 0xC0000001    
IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR           USBSER000   SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW       USBSER000   SUCCESS Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
IOCTL_SERIAL_CLR_DTR            USBSER000   * 0xC0000001    
IRP_MJ_CLEANUP                  USBSER000   SUCCESS 
IRP_MJ_CLOSE                    USBSER000   SUCCESS 
有帮助吗?

解决方案

关于超级终端和.NET串口对象之间的区别,超级终端是一个商业的、稳定的应用程序。如果底层串行端口对象死亡或引发异常,超级终端会将其隐藏起来。.NET 串行端口对象比我使用过的任何其他 .NET 对象引发更多异常。

要点:

  • 每当您更改设置时,请先关闭它,更改它,然后重新打开它。有些端口确实讨厌在打开时更改它。
  • 期望围绕您所做的每件事围绕您的串行端口对象进行大量“try-catch”。
  • 确保列出的每种可能的异常都有一个,并确保每一个都检查消息(在不同情况下可能会有所不同)。许多只需关闭并重新打开即可恢复。
  • 尝试准确跟踪抛出异常的位置。看看修改你设置的顺序是否可以修复它......这个对象真的很挑剔。

如果您尝试在打开之前将 DTR 显式设置为 false,那么您可能只需微笑并用该设备裸露它即可。SerialPort 对象并不是 .NET 中实现良好的库的杰出示例之一。如果您注意到,超级终端也会出现同样的错误,但它只是忽略它。

如果可以,请尝试使用常规串行端口或不同品牌的 USB 设备。如果您仍然遇到相同的错误,则可能是您的应用程序端出现问题。

其他提示

在实际UARTDTREnable会坚持你的DTRUART引脚,以表明您已经准备好接收数据。

根据您的驱动程序的实现,您可能需要设置DTREnabletrue打开端口。

请参阅此论坛帖子。我怀疑它与硬件或驱动程序故障的事情。这并不能解释为什么它与超级终端的作品虽然。按照从约瑟夫M.新人的意见,看看有什么超级终端做不同的。

,它看起来像的差的握手。

我还没有与SerialPort类的问题,并写入跑在800000个bps的应用程式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top