Frage

Ich versuche, von einer seriellen Schnittstelle mit der System.IO.Ports.SerialPort Klasse zu öffnen und zu lesen. Ich schleppte die serielle Schnittstelle aus dem Werkzeugbereich (VS 2008) auf meine Windows-Form. Ich habe eine Eigenschaft Gitter einrichten bekam so kann ich einfach die Eigenschaften der seriellen Schnittstelle zur Laufzeit geändert werden. Wenn ich versuche, den Port zu öffnen, erhalte ich den Fehler unten. Ich verstehe nicht, warum, weil ich öffnen und lesen aus dem Hafen mit Hyperterminal. Irgendwelche Ideen?

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

Beachten Sie, dies ist ein USB-Anschluss, so ist es actuall eine virtuelle serielle Schnittstelle Meine Einstellungen sind wie folgt:
BaudRate = 9600
DataBits = 8
DiscardNull = false
DTREnable = false
Handshake = None
Parität = Keine
ParityReplace = 63
Portname = COM3
ReadBufferSize = 4096
Readtimeout = -1
ReceivedBytes = 1 | TrsEnable = False
StopBits = One
WriteBufferSize = 2048
Writetimeout = -1

Ich heruntergeladen PortMon von Sysinternals. Ich habe 2 Protokolle erfasst, das erste das Protokoll ist wie das, was passiert, wenn Hyper den Port öffnet, das zweite ist das, was dann geschieht, wenn die .NET Serialport Klasse versucht, den Port zu öffnen:

Hyper:

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 
War es hilfreich?

Lösung

In Bezug auf die Unterschiede zwischen Hyper-Terminal und dem .NET seriellen Port-Objekt, ist Hyperterminal eine kommerzielle, stabile App. Wenn das zugrunde liegende Objekt serielle Schnittstelle gestorben oder eine Ausnahme ausgelöst hat, versteckte Hyper es von Ihnen. Das .NET serielle Schnittstelle Objekt wirft mehr Ausnahmen als jedes andere .NET-Objekt, das ich benutzt habe.

Punkte zu machen:

  • Jedes Mal, wenn Sie eine Einstellung ändern, schließen Sie es zuerst, es ändern, dann wieder öffnen. Einige Ports hasse es wirklich, wenn Sie es während geöffnet ändern.
  • Erwarten Sie eine Menge von ‚Try-Fang um das serielle Port-Objekt zu tun, um alles, was Sie tun.
  • Achten Sie darauf, eine für jede mögliche Ausnahme haben aufgelistet, und stellen Sie sicher, dass jeder die Nachricht überprüft (es kann unter verschiedenen Umständen unterschiedlich sein). Viele sind erstattungsfähig einfach durch Schließen und erneuten Öffnen.
  • Versuchen Sie folgende genau dort, wo die Ausnahmen geworfen werden. Sehen Sie, wenn Ändern der Reihenfolge Sie die Dinge gesetzt behebt es ... das Objekt wirklich pingelig.

Wenn Sie versucht haben, explizit vor dem Öffnen DTR auf false setzen, dann können Sie einfach und entblößt es mit diesem Gerät grinsen müssen. Das Serialport-Objekt ist nicht eines der leuchtenden Beispiele für eine gut umgesetzt Bibliothek in .NET. Wenn Sie bemerken, wird Hyper-Terminal, dass die gleichen Fehler, aber es ignoriert es einfach.

Wenn Sie können, versuchen Sie es mit einem normalen seriellen Schnittstelle oder einem anderen Marke USB-Gerät. Wenn Sie immer noch die gleichen Fehler, könnte es etwas auf dem App-Seite.

Andere Tipps

Im wirklichen UART, DTREnable den DTR Stift Ihrer UART behauptet, um anzuzeigen, Sie sind bereit, Daten zu empfangen.

Je nach Implementierung des Fahrers, müssen Sie möglicherweise DTREnable einstellen true dem Port zu öffnen.

Sehen Sie diesen Forum posten rel="nofollow. Ich vermute, es hat mit der Hardware oder dem Fahrer eine Fehlfunktion zu tun. Dies erklärt nicht, warum es mit Hyperterminal funktioniert aber. Folgen Sie den Rat von Joseph M. Newcomer zu sehen, was Hyper anders tut.

es sieht aus wie der Unterschied der Handshaking ist.

Ich habe keine Probleme mit der Serialport Klasse hatten und haben Anwendungen geschrieben, die auf 800.000 bps lief.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top