Ошибка открытия последовательного порта - PullRequest
3 голосов
/ 30 января 2009

Я пытаюсь открыть и прочитать с последовательного порта, используя класс 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 = false
Рукопожатие = Нет
Четность = Нет
ParityReplace = 63
PortName = COM3
ReadBufferSize = 4096
ReadTimeout = -1
ReceivedBytes = 1
TrsEnable = False
StopBits = один
WriteBufferSize = 2048
WriteTimeout = -1

Я скачал PortMon от sysinternals. Я захватил 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 ]

4 голосов
/ 31 января 2009

Что касается различий между гипертерминалом и объектом последовательного порта .NET, Hyperterminal является коммерческим стабильным приложением. Если основной объект последовательного порта умер или выдал исключение, Hyperterminal скрыл его от вас. Объект последовательного порта .NET генерирует больше исключений, чем любой другой объект .NET, который я использовал.

Очков, чтобы сделать:

  • Всякий раз, когда вы меняете настройку, сначала закройте ее, измените ее, а затем снова откройте. Некоторые порты действительно ненавидят его, когда вы меняете его в открытом состоянии.
  • Ожидайте много «попыток поймать» вокруг вашего объекта последовательного порта, вокруг каждой вещи, которую вы делаете.
  • Убедитесь, что у вас есть одно для каждого возможного исключения в списке, и убедитесь, что каждый проверяет сообщение (оно может отличаться при разных обстоятельствах). Многие из них можно восстановить, просто закрыв и снова открыв.
  • Попытайтесь точно следовать тем, где выбрасываются исключения. Посмотрите, исправляет ли это измененный порядок, который вы устанавливаете ... объект действительно привередливый.

Если вы пытались явно установить DTR в значение false перед открытием, то вам, возможно, придется ухмыльнуться и обнажить его на этом устройстве. Объект SerialPort не является одним из ярких примеров хорошо реализованной библиотеки в .NET. Если вы заметили, гипертерминал получает ту же ошибку, но просто игнорирует ее.

Если можете, попробуйте использовать обычный последовательный порт или USB-устройство другой марки. Если вы все еще получаете ту же ошибку, это может быть что-то на стороне вашего приложения.

1 голос
/ 30 января 2009

В действительности UART, DTREnable установит вывод DTR вашего UART, чтобы указать, что вы готовы к приему данных.

В зависимости от реализации вашего драйвера может потребоваться установить DTREnable в true, чтобы открыть порт.

0 голосов
/ 17 февраля 2009

похоже, что разница в рукопожатии.

У меня не было проблем с классом serialport, и я написал приложения, которые работали со скоростью 800 000 бит / с.

0 голосов
/ 30 января 2009

Смотрите это сообщение на форуме . Я подозреваю, что это связано с неисправностью оборудования или драйвера. Это не объясняет, почему он работает с Hyperterminal. Следуйте совету Джозефа М. Новичка, чтобы понять, что делает Гипертерминал по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...