打开串口时出错

时间:2009-01-30 17:29:49

标签: .net serial-port

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

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连接,因此它实际上是一个虚拟串行端口 我的设置如下:
BaudRate = 9600
DataBits = 8
DiscardNull = false
DtrEnable =假
握手=无
奇偶校验=无 ParityReplace = 63
PortName = COM3
ReadBufferSize = 4096
ReadTimeout = -1
ReceivedBytes = 1
TrsEnable = False
StopBits =一个 WriteBufferSize = 2048
WriteTimeout = -1

我从sysinternals下载了PortMon。我已经捕获了2个日志,第一个是日志,当Hyperterminal打开端口时会发生什么,第二个是.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 SerialPort:

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 

4 个答案:

答案 0 :(得分:4)

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

要点:

  • 每当您更改设置时,请先关闭它,更改它,然后重新打开它。当你在打开时更改它时,有些端口真的很讨厌它。
  • 期待在你的串行端口对象周围做很多'try-catch',围绕你做的每一件事。
  • 确保列出的每个可能的例外都有一个,并确保每个人检查邮件(在不同情况下它可能不同)。许多只需通过关闭和重新开启即可恢复。
  • 请仔细检查抛出异常的位置。看看是否修改了你设置的修改顺序......对象真的很挑剔。

如果您在打开之前尝试将DTR明确设置为false,那么您可能只需要使用该设备咧嘴一笑。 SerialPort对象不是.NET中实现良好的库的发光示例之一。如果你注意到,超级终端会得到同样的错误,但它只会忽略它。

如果可以,请使用常规串口或其他品牌的USB设备进行尝试。如果您仍然遇到相同的错误,则可能是您应用端的内容。

答案 1 :(得分:1)

在真实UART中,DTREnable会断言DTR的{​​{1}}图钉,表明您已准备好接收数据。

根据您的驱动程序的实施情况,您可能需要将UART设置为DTREnable以打开端口。

答案 2 :(得分:0)

forum post。我怀疑它与硬件或驱动程序故障有关。这并不能解释为什么它适用于Hyperterminal。遵循Joseph M. Newcomer的建议,看看Hyperterminal的做法有何不同。

答案 3 :(得分:0)

看起来差异就是握手。

我没有遇到过serialport类的问题,并编写了运行速度为800,000 bps的应用程序。