문제

System.io.ports.serialport 클래스를 사용하여 직렬 포트에서 열고 읽으려고합니다. 직렬 포트를 공구 창 (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
데이터베트 = 8
discardNull = false
dtrenable = false
핸드 셰이크 = 없음
패리티 = 없음
parityreplace = 63
portname = com3
ReadBuffersize = 4096
readtimeout = -1
수신 된비 = 1
trsenable = false
stopbits = one
WriteBuffersize = 2048
WriteTimeout = -1

Sysinternals에서 Portmon을 다운로드했습니다. 나는 2 개의 로그를 캡처했는데, 첫 번째는 Hyperterminal이 포트를 열 때 어떻게되는지 로그입니다. 두 번째는 .NET Serialport 클래스가 포트를 열려고 할 때 행복합니다.

hyperterminal :

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 
도움이 되었습니까?

해결책

Hyperterminal과 .NET Serial Port Object의 차이점과 관련하여 Hyperterminal은 상업적인 안정적인 앱입니다. 근본적인 직렬 포트 개체가 예외를 죽이거나 던진 경우, 하이퍼 터미널이 당신에게 숨겨져있었습니다. .NET 직렬 포트 개체는 내가 사용한 다른 .NET 객체보다 더 많은 예외를 던집니다.

만들어야 할 사항 :

  • 설정을 변경할 때마다 먼저 닫은 다음 변경 한 다음 다시 열립니다. 일부 포트는 열면 개장하는 동안 변경할 때 실제로 싫어합니다.
  • 직렬 포트 개체 주위에 많은 'Try-Catch's가 당신이하는 모든 일을 할 것으로 기대합니다.
  • 가능한 각 예외에 대해 하나가 있는지 확인하고 각각이 메시지를 확인하는지 확인하십시오 (다른 상황에서는 다를 수 있음). 많은 사람들이 단순히 폐쇄 및 재개로 회복 가능합니다.
  • 예외가 발생하는 위치를 정확히 따르십시오. 설정 순서를 수정하면 물건을 수정하면 객체가 정말 까다 롭습니다.

열기 전에 DTR을 False로 명시 적으로 설정하려고 시도한 경우 해당 장치로 미소를 짓고 맨손으로해야 할 수도 있습니다. 시리얼 포트 객체는 .NET에서 잘 구현 된 라이브러리의 빛나는 예 중 하나가 아닙니다. 눈에 띄는 경우, Hyperterminal은 동일한 오류를 얻지 만 무시합니다.

가능하다면 일반 직렬 포트 또는 다른 브랜드 USB 장치로 사용해보십시오. 여전히 같은 오류가 발생하면 앱 측면에있을 수 있습니다.

다른 팁

진짜로 UART, DTREnable 말할 것입니다 DTR 당신의 핀 UART 데이터를 수신 할 준비가되었음을 나타냅니다.

운전자의 구현에 따라 설정해야 할 수도 있습니다. DTREnable 에게 true 포트를 열려면.

이것 좀 봐 포럼 게시물. 하드웨어 또는 드라이버 오작동과 관련이 있다고 생각합니다. 이것은 왜 Hyperterminal에서 작동하는지 설명하지 않습니다. Joseph M. Newcomer의 조언을 따르면 Hyperterminal이 어떻게 다르게하고 있는지 확인하십시오.

차이가 악수 인 것 같습니다.

Serialport 클래스에 문제가 없었으며 80 만 파운드에 달하는 앱을 작성했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top