Frage

Ich plane auf Umschreiben eine Win32-Anwendung (native C ++) in .NET - höchstwahrscheinlich mono verwenden, so kann ich es auf Win32, Linux und Mac. Das Problem, das ich zu lösen versuchen (nur wirklich für Win32 entwickelt zu haben) ist ein Thema, mit der seriellen Port-Definition. Wie findet man typischerweise Unterschiede in der Plattform identifizieren, wenn es nur um eine ausführbare Datei soll. Insbesondere wird das COM-Port wird in Windows als COM1 oder etwas ähnlichem (\. \ COM), aber unter Linux sich als so etwas wie / dev / ttyS0 angegeben identifiziert.

Prüft man die Plattform zur Laufzeit für diese Information?

Ich denke, der einzige Unterschied in der das Öffnen und Schließen des Hafens sein würde. Das Lesen und Schreiben ist das gleiche.

Vielleicht ist dies eine allgemeinere Frage, dass es gilt für jede Plattform-spezifische Dinge in Mono / .NET.

Wie das Sie behandeln? In einiger String-Ressource oder Config-Datei oder hartcodiert und den Schalter basierend auf Laufzeitplattform?

Jedes Codebeispiel für diesen? Hinweis sind ein C ++ Entwickler und nicht vertraut mit allen Klassen in .NET. gibt es eine Möglichkeit, entweder über das serielle Schnittstelle Benennungsschema aus der CLR oder gibt es einen Weg, um die OS / Plattform aus der CLR?

zu bekommen

wäre es schön gewesen, wenn die CLR der Lage gewesen, die seriellen Schnittstellen in einer unabhängigeren Weise zu präsentieren. Vielleicht ist das nicht möglich.

Danke, Tim

EDIT

die eine Antwort gegeben, so weit ich denke, ich sollte nur die
versuchen SerialPort.GetPortNames () Aufzählung zuerst zu sehen, ob es funktioniert. (Auf beiden Plattformen)

In win32 für die höheren Portnummern und ofr den USB-Dongle - es ist nicht so einfach wie die grundlegende COM-Port-Enumeration.

Ich werde die Ergebnisse melden.

War es hilfreich?

Lösung

Gerade dieses Thema entdeckt und dachte, dass ich irgendetwas nur meine Entdeckungen hinzufügen: zufällig, ich bin auch über dieses auf einem Mac besorgt. Unter Windows und Linux (in VS und Mono gleichermaßen) SerialPort.GetPortNames () gibt eine Liste mit den folgenden Regeln:

1) Windows gibt eine Liste von Zeichenketten wie Com1, Com4, verpassten jeder die nicht existieren (USB Serial Adapter scheinen eine COM-Nummer auf der Grundlage der Stecker nehmen sie in, consistantly) Aus meiner seriellen Port-Scanner angeschlossen werden :

Scanning COM1 Scanning COM4 Scanning Complete

2) Linux liefert alle möglicherweise TTY serielle Ports, die der Compiler des Linux-Distribution aktiviert hat. Dies scheint etwa 8 Ports zu sein, was, wenn Sie zu öffnen versuchen, wird eine Ausnahme werfen (von meinem seriellen Port-Scanner:

Scanning /dev/ttyS0 Scanning /dev/ttyS1 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open () [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open () at HSMScanner.Program.Main (System.String[] args) [0x00000] Scanning /dev/ttyS2 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open () [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open () at HSMScanner.Program.Main (System.String[] args) [0x00000] Scanning /dev/ttyS3 Port FailedSystem.IO.IOException: I/O Error at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int) at System.IO.Ports.SerialPort.Open () [0x00000] at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open () at HSMScanner.Program.Main (System.String[] args) [0x00000]

3) Macs ...

Die Sanitäter oje. Macs (wenn eine USB-serielle Schnittstelle in und Treiber eingesteckt und alles sind ok) nicht zurück alles auf dem GetPortNames (). Nada. Suchen Sie im Verzeichnis / dev / tty, erscheinen die zusätzlichen Geräte nur dann, wenn das Gerät eingesteckt ist und Namen wie /dev/tty.usbserial-A7006Ro7 unfortunatly, unter diesem Namen als Argument an das Programm, gefolgt von serial.open dosnt scheinen hat keine Wirkung.

Suchen Sie mehr hinein.

Andere Tipps

In .Net, müssen Sie System.IO.Ports. Namen wie "COM1" und "/ dev / ttyS0" sind zufällig OS Namen. Warum brauchen Sie, sie zu codieren? Der Benutzer sollte nur aus der Liste der verfügbaren Ports auswählen.

Offensichtlich Sie diese Liste zur Laufzeit bestimmen. In der Tat, mit USB-Seriell-Adapter mögen Sie vielleicht die Möglichkeit zu prüfen, dass der Benutzer nur nach dem Start Ihres Programms entdeckt, dass er vergaß seinen USB-Seriell-Adapter anzuschließen. Das bedeutet, dass Sie diese Liste jedes Mal, wenn Sie den Konfigurationsdialog zeigen nochmals zu lesen. Der USB-Adapter ist sehr wahrscheinlich nicht COM1, BTW.

(Ich kann nicht für die Qualität der Mono Implementierung von Serialport bürgen. Eine schnelle Google-Suche hat mich ein bisschen besorgt, aber selbst testen)

hatte ich einen Blick auf diese und es scheint, der Mono-Code für serielle Ports Aufzählen wird nicht, aber Linux auf etwas zu arbeiten.

(von mcs / Klasse / System / System.IO.Ports / SerialPort.cs)

            public static string [] GetPortNames ()
            {
                    int p = (int) Environment.OSVersion.Platform;
                    List<string> serial_ports = new List<string>();

                    // Are we on Unix?
                    if (p == 4 || p == 128 || p == 6) {
                            string[] ttys = Directory.GetFiles("/dev/", "tty*");
                            foreach (string dev in ttys) {
                                    if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB"))
                                            serial_ports.Add(dev);
                            }
                    } else {

Auf OSX würde ich denken, dass Sie wahrscheinlich /dev/tty.* passen könnten (FreeBSD müßte / dev / ttyU [0-9] +)

Ich kann nicht sagen, ich bin verliebt in die Art und Weise hebt es die unter ihm OS läuft entweder ..

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