Fehler beim öffnen der seriellen Schnittstelle
Ich versuche zu öffnen und zu Lesen von einer seriellen Schnittstelle mit dem System.IO.- Ports.SerialPort-Klasse. Ich schleppte den seriellen port im tool-Bereich (VS 2008) auf meiner windows form.
Ich habe eine Eigenschaft grid set-up, so kann ich leicht ändern Sie die Eigenschaften des com-Ports zur Laufzeit.
Wenn ich versuche den port zu öffnen, erhalte ich die Fehlermeldung, die unten gezeigt. Ich verstehe nicht warum, denn ich kann Sie öffnen und Lesen von der Schnittstelle mittels 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 dass es aktuellen einen virtuellen seriellen port
Meine Einstellungen sind wie folgt:
BaudRate = 9600
DataBits = 8
DiscardNull = false
DtrEnable = false
Handshake = None
Parität = None
ParityReplace = 63
PortName = COM3
ReadBufferSize = 4096
ReadTimeout = -1
ReceivedBytes = 1
TrsEnable = False
StopBits = One
WriteBufferSize = 2048
WriteTimeout = -1
Ich heruntergeladen habe PortMon von sysinternals. Eingefangen habe 2 logs, das erste ist das log, was passiert, wenn Hyperterminal öffnet den port, der zweite ist das, was happends, wenn Die .net SerialPort-Klasse versucht den port zu öffnen:
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 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
B, Es gibt keine Ausnahme zu diesem Fehler, und es funktioniert in hyperterminal.
In der Win32-API, DTR gesteuert wird, indem Sie eine der Fahnen in der
DCB
Struktur: msdn.microsoft.com/en-us/library/aa363436(VS.85).aspxHast du jemals dieses problem zu beheben? Ich weiß, das war eine Weile her jetzt, aber ich bin mit den das gleiche problem mit subtilen unterschieden.
Ich verwendet ein 3rd-party-Komponente OpenNETCF.IO.Serial.dll. Funktioniert sehr gut.
InformationsquelleAutor Jeremy | 2009-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bezüglich der Unterschiede zwischen dem hyperterminal und der .NET serial port-Objekt, das Hyperterminal ist eine kommerzielle, stabile app. Wenn die zugrunde liegenden seriellen port-Objekt gestorben ist, oder warf eine Ausnahme, Hyperterminal versteckte es von Ihnen. Die .NET serial port-Objekt wirft mehr Ausnahmen als alles andere .NET-Objekt, die ich verwendet habe.
Punkte zu machen:
Wenn Sie versucht haben, das explizite setzen von DTR auf " false vor dem öffnen, dann können Sie nur noch zum grinsen und nackten es mit diesem Gerät. Die SerialPort-Objekt ist nicht eines der leuchtenden Beispiele für eine gut umgesetzte Bibliothek .NET. Wenn Sie bemerken, hyperterminal bekommt, die gleichen Fehler, aber es einfach ignoriert.
Wenn Sie können, versuchen Sie es mit einem normalen seriellen port oder eine andere Marke usb-Gerät. Wenn Sie immer noch den gleichen Fehler, es kann etwas, das auf Ihrem app Seite.
Hyperterminal nicht zu einem IOCTL_SERIAL_CLR_DTR ausgestellt werden. Nicht sicher, wie Sie Sie zu unterdrücken .net-framework.
Leider können Sie nicht in der Lage sein, etwas dagegen zu Unternehmen. :/
InformationsquelleAutor Robert P
In real
UART
,DTREnable
wird behaupten dieDTR
pin IhrerUART
um anzuzeigen, dass Sie sind bereit, Daten zu empfangen.Je nach Treiber-Implementierung, stellen Sie
DTREnable
zutrue
den port zu öffnen.Diese Feste mein problem mit dem Anschluss, einfach _Port.DtrEnable=true;
InformationsquelleAutor Quassnoi
Sehen diese forum post. Ich vermute, es hat zu tun mit der hardware oder der Treiber funktioniert nicht richtig. Dies nicht erklären, warum es funktioniert mit Hyperterminal obwohl. Befolgen Sie die Ratschläge von Joseph M. Newcomer, um zu sehen, was Hyperterminal ist anders machen.
Ich rannte th PortMon software von sysinternals und ergänzt die Protokolle zu meiner Frage, ich weiß nur nicht, welche win32-Befehl den Fehler verursacht, wie how to get arround es. Gibt es eine bessere serielle Schnittstelle der Klasse zur Verfügung?
InformationsquelleAutor kgiannakakis
sieht es aus wie der Unterschied ist das handshaking.
bisher hatte ich noch keine Probleme mit dem serialport-Klasse und haben apps programmiert, ran an die 800.000 bps.
InformationsquelleAutor dbasnett