gpt4 book ai didi

.net - 使用 System.IO.Ports.SerialPort 类打开串行端口时出错

转载 作者:行者123 更新时间:2023-12-01 19:34:14 26 4
gpt4 key购买 nike

我正在尝试使用 System.IO.Ports.SerialPort 类打开并读取串行端口。我将串行端口从工具 Pane (Visual Studio 2008) 拖到我的 Windows 窗体应用程序上。

我已经设置了属性网格,因此我可以在运行时轻松更改串行端口的属性。当我尝试打开端口时,出现如下错误。我不明白为什么,因为我可以使用 super 终端打开并读取端口。

有什么想法吗?

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
DiscardNull = false
DtrEnable = false
握手=无
奇偶校验=无
奇偶校验替换 = 63
端口名称 = COM3
读取缓冲区大小 = 4096
读取超时 = -1
已接收字节数 = 1
TrsEnable = False
停止位 = 1
写入缓冲区大小 = 2048
写入超时 = -1

我下载了PortMon来自Sysinternals 。我捕获了两个日志。第一个是日志 HyperTerminal 时发生了什么打开端口,第二个是 .NET SerialPort 类尝试打开端口时发生的情况:

super 终端:

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

最佳答案

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

要点:

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

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

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

关于.net - 使用 System.IO.Ports.SerialPort 类打开串行端口时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/496415/

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