System.IO.Ports.SerialPort - kann IOCTL_SERIAL_SET_WAIT_MASK konfiguriert werden?
-
06-07-2019 - |
Frage
Ich habe versucht, etwas darüber zu erfahren, wie .Net (3.5) interagiert mit dem seriell Port durch die System.IO.Ports.SerialPorts
Klasse durch eine kleinen Windows-Forms-Anwendung zu schreiben Anrufer Anzeigedaten von einem alten externen Modem zu sammeln.
Ich habe getestet, dass das Modem Anrufer-Display unterstützt; mit Putty oder Hyper Ich kann das Modem so konfiguriert, dass Anrufer-Anzeigedaten (mit dem Befehl AT#CID=1
zu sammeln, die ich hier ), und wenn das Telefon klingelt, werden die Daten angezeigt. Im Terminal-Fenster, sieht es wie folgt aus:
RING
DATE = 0308
TIME = 2045
NMBR = 01234567890
RING
Meine C # Anwendung erscheint erfolgreich das Modem zu konfigurieren und zeigt einen RING
Meldung, wenn das Telefon klingelt; aber es nie zeigt die Anrufer-ID-Daten.
In dem Bemühen, zu verstehen, warum dies so ist, ich vergleichen die von den verschiedenen Kunden ergriffenen Maßnahmen Sysinternals Portmon .
Der primäre Unterschied erscheint in der Verbindungskonfiguration; meine C # Anwendung enthält die folgende Zeile, die Putty und Hyperterminal nicht;
0.00000307 callerID.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
Wie ich es verstehe, IOCTL_SERIAL_SET_WAIT_MASK
ist eine abschließende Liste von Nachrichtentypen filtern für.
So, drei Fragen:
Ist es möglich, dass die Anrufer-ID-Informationen von IOCTL_SERIAL_SET_WAIT_MASK
unterdrückt werden?
Wenn ja, wie kann ich es konfigurieren, dass die Anrufer-ID-Informationen zu zeigen? Es scheint nicht von den Klasseneigenschaften zugänglich zu sein.
Wenn ich es nicht konfigurieren kann, ist meine einzige Möglichkeit, dies zu umgehen, meine eigenen Wrapper zu den untergeordneten Systemfunktionen schreiben die serielle Schnittstelle steuern?
Mein Verständnis von serieller Port-Kommunikation ist sehr einfach, so dass ich erwarte ich bin weg in meiner Diagnose. Jede Führung dankbar angenommen.
Lösung
Ich war weg mit meiner Diagnose.
Es scheint, dass die WriteLine
Verfahren beendet nicht die Befehle mit dem Leitungsabschluss sendet das Modem erwartet.
Alles, was ich tun musste, war ein Wagenrücklauf auf die Befehle hinzufügen, ich sende, und schicken sie die Write
Methode.
Wir entschuldigen uns für jemandes Zeit zu verschwenden.
Andere Tipps
fand ich diese auf MSDN, die wie ein anständiges Beispiel sieht wie über P / Invoke die serielle Schnittstelle für den Zugriff auf das System dLL.
Ich würde noch gerne wissen, ob ich um meine Probleme mit der .NET-Klasse erhalten kann.