Erreur lors de l'ouverture du port série
Je suis en train d'ouvrir et de lire à partir d'un port série à l'aide du Système.IO.Les Ports.Classe SerialPort. J'ai traîné le port série de l'outil de volet (VS 2008) sur mon écran de windows.
J'ai une propriété de la grille de jeu pour que je puisse facilement modifier les propriétés du port série au moment de l'exécution.
Lorsque j'essaie d'ouvrir le port, je reçois le message d'erreur indiqué ci-dessous. Je ne comprends pas pourquoi, parce que je peux l'ouvrir et le lire à partir du port en utilisant Hyperterminal.
Des idées?
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.0\Projects\Kiosk\EmbeddedBrowser\Windows Forms\Test.CardReader\Form1.cs:line 166
Remarque, c'est une connexion USB, il est donc actuall un port série virtuel
Mes paramètres sont les suivants:
BaudRate = 9600
Bits de données = 8
DiscardNull = false
DtrEnable = false
Poignée De Main = None
La Parité = Aucune
ParityReplace = 63
PortName = COM3
ReadBufferSize = 4096
ReadTimeout = -1
ReceivedBytes = 1
TrsEnable = False
Bits D'Arrêt = Un
WriteBufferSize = 2048
WriteTimeout = -1
J'ai téléchargé PortMon de sysinternals. J'ai capturé 2 journaux, le premier est le journal de la façon dont ce qui se passe lorsque Hyperterminal ouvre le port, la seconde est ce qui se fait quand Le .net classe SerialPort essaie d'ouvrir le port:
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, Il n'est nul exception à cette erreur, et c'est hyperterminal.
Dans l'API Win32, DTR est contrôlée par l'un des drapeaux dans le
DCB
structure: msdn.microsoft.com/en-us/library/aa363436(SV.85).aspxAvez-vous jamais résoudre ce problème? Je sais que c'était il y a un moment maintenant, mais je suis confronté le même problème avec de subtiles différences.
J'ai utilisé un 3ème partie composant appelé OpenNETCF.IO.Serial.dll. Fonctionne très bien.
OriginalL'auteur Jeremy | 2009-01-30
Vous devez vous connecter pour publier un commentaire.
Sur les différences entre hyperterminal et la .NET port série de l'objet, Hyperterminal est un commercial, application plus stable. Si le port série sous-jacente de l'objet est décédé ou a déclenché une exception, Hyperterminal caché de vous. L' .NET port série de l'objet jette plus d'exceptions que de tout autre .NET objet que j'ai utilisé.
Points:
Si vous avez essayé de définir explicitement DTR à faux avant de l'ouvrir, alors vous pouvez juste avoir à sourire et nu avec cet appareil. Le SerialPort objet n'est pas l'un des exemples concrets d'une mise en œuvre de la bibliothèque .NET. Si vous remarquez, hyperterminal obtient la même erreur, mais il l'ignore.
Si vous le pouvez, essayez avec un port série classique ou une autre marque périphérique usb. Si vous obtenez toujours le même message d'erreur, cela peut être quelque chose de votre côté app.
Hyperterminal ne cause pas une IOCTL_SERIAL_CLR_DTR à être émis. Pas sûr de la façon de le supprimer dans le .net framework.
Malheureusement, vous pouvez pas être capable de faire quelque chose à ce sujet. :/
OriginalL'auteur Robert P
Dans la vraie
UART
,DTREnable
va affirmer leDTR
code pin de votreUART
pour indiquer que vous êtes prêt à recevoir des données.En fonction de votre pilote de mise en œuvre, vous devrez peut-être définir
DTREnable
àtrue
pour ouvrir le port.Cela a réglé mon problème en utilisant le port, simple _Port.DtrEnable=true;
OriginalL'auteur Quassnoi
Voir ce post sur le forum. Je soupçonne qu'il a à faire avec le matériel ou le pilote défectueux. Ce n'est pas expliquer pourquoi cela fonctionne avec Hyperterminal. Suivez les conseils de Joseph M. nouveau venu pour voir ce que Hyperterminal est en train de faire différemment.
J'ai couru th PortMon logiciel de sysinternals, et ajouté les journaux à ma question, je ne sais pas qui commande win32 maintenant est à l'origine de l'erreur, comment comment faire pour obtenir autour. Est-il un meilleur port série de la classe disponible?
OriginalL'auteur kgiannakakis
il ressemble à la différence, c'est l'établissement de la liaison.
je n'ai pas eu de problèmes avec la classe serialport et ont écrit des applications qui a couru à 800 000 bps.
OriginalL'auteur dbasnett