Question

Je prévois de réécrire une application Win32 (C ++ natif) en .NET - probablement en mono pour pouvoir l’exécuter sur Win32, Linux et mac. Le problème que j'essaie de résoudre (n'ayant que réellement développé pour Win32) est un problème lié à la définition du port série. Comment identifie-t-on généralement les différences de plate-forme alors qu’il n’ya qu’un seul exécutable? Plus précisément, le port COM est identifié dans les fenêtres en tant que COM1 ou quelque chose du genre (\. \ COM), mais sous Linux, il est spécifié en tant que / dev / ttyS0.

Est-ce que l'on vérifie ces informations sur la plate-forme au moment de l'exécution?

Je pense que la seule différence serait dans l'ouverture et la fermeture du port. La lecture et l'écriture sont les mêmes.

C’est peut-être une question plus générique dans la mesure où elle s’applique à tout élément spécifique à la plate-forme en mono / .NET.

Comment gérez-vous cela? Dans une ressource chaîne ou un fichier de configuration, ou codé en dur et en fonction de la plate-forme d’exécution?

Un exemple de code pour cela? Notez que je suis un développeur C ++ et que je ne suis pas familiarisé avec toutes les classes disponibles dans .NET. Existe-t-il un moyen d’obtenir le schéma de nommage des ports série du CLR ou existe-t-il un moyen d’obtenir le système d’exploitation / la plate-forme du CLR?

Il aurait été intéressant que le CLR puisse présenter les ports série de manière plus indépendante. Peut-être que ce n'est pas possible.

Merci, Tim

EDIT

Étant donné la seule réponse à ce jour, je suppose que je devrais simplement essayer le
Enumération SerialPort.GetPortNames () d'abord pour voir si cela fonctionne. (sur les deux plates-formes)

Dans win32, les numéros de port les plus élevés et le dongle USB ne sont pas aussi simples que l’énumération de base du port COM.

Je rapporterai les résultats ici.

Était-ce utile?

La solution

Je viens de découvrir ce fil, et je pense pouvoir ajouter mes découvertes: au hasard, je suis aussi inquiet à ce sujet sur un mac. SerialPort.GetPortNames () renvoie une liste avec les règles suivantes sous Windows et Linux (à la fois comme VS et Mono):

1) Windows renvoie une liste de chaînes telles que Com1, Com4. Il en manque des qui n'existent pas (les adaptateurs série USB semblent prendre un numéro COM basé sur la fiche à laquelle ils sont branchés, de manière cohérente). À partir de mon scanner de port série :

Analyse du COM1 Numérisation COM4 Numérisation terminée

2) Linux renvoie tous les ports série tty éventuellement activés par le compilateur de la distribution linux. Cela semble être environ 8 ports, qui, si vous essayez d'ouvrir, lève une exception (de mon scanner de port série:

Analyse / dev / ttyS0 Analyse du disque / dev / ttyS1 FailedSystem.IO.IOException: erreur d'E / S   sur System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parité de parité, StopBits stopBits, Boolean dtEnable, Boolean rtsEnable, Intégré de lecture, Int32 readTimeout, Int32 [0x00000]   at (encapsuleur remoting-invoke-with-check) System.IO.Ports.SerialPortStream: .ctor (chaîne, int, int, System.IO.Ports.Parity, System.IO.Ports.StopBits, bool, bool, System. IO.Ports.Handshake, int, int, int, int)   à System.IO.Ports.SerialPort.Open () [0x00000]   at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort: Open ()   à HSMScanner.Program.Main (System.String [] args) [0x00000] Analyse du disque / dev / ttyS2 FailedSystem.IO.IOException: erreur d'E / S   sur System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parité de parité, StopBits stopBits, Boolean dtEnable, Boolean rtsEnable, Intégré de lecture, Int32 readTimeout, Int32 [0x00000]   at (encapsuleur remoting-invoke-with-check) System.IO.Ports.SerialPortStream: .ctor (chaîne, int, int, System.IO.Ports.Parity, System.IO.Ports.StopBits, bool, bool, System. IO.Ports.Handshake, int, int, int, int)   à System.IO.Ports.SerialPort.Open () [0x00000]   at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort: Open ()   à HSMScanner.Program.Main (System.String [] args) [0x00000] Analyse du disque / dev / ttyS3 FailedSystem.IO.IOException: erreur d'E / S   sur System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parité de parité, StopBits stopBits, Boolean dtEnable, Boolean rtsEnable, Intégré de lecture, Int32 readTimeout, Int32 [0x00000]   at (encapsuleur remoting-invoke-with-check) System.IO.Ports.SerialPortStream: .ctor (chaîne, int, int, System.IO.Ports.Parity, System.IO.Ports.StopBits, bool, bool, System. IO.Ports.Handshake, int, int, int, int)   à System.IO.Ports.SerialPort.Open () [0x00000]   at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort: Open ()   à HSMScanner.Program.Main (System.String [] args) [0x00000]

3) Macs ...

Oh cher oh cher Les Mac (lorsqu'un port série USB est connecté et que les pilotes et tout fonctionne correctement) ne renvoient rien sur GetPortNames (). Nada. En regardant dans / dev / tty, les périphériques supplémentaires apparaissent uniquement lorsque le périphérique est branché et que des noms tels que /dev/tty.usbserial-A7006Ro7 ne sont malheureusement pas utilisés, ce nom étant utilisé comme argument du programme suivi de serial.open dosnt. avoir un effet.

En savoir plus.

Autres conseils

En .Net, vous avez besoin de System.IO.Ports. Des noms tels que " COM1 " et & dev; / dev / ttyS0 " sont des noms d'OS aléatoires. Pourquoi avez-vous besoin de les coder en dur? L'utilisateur doit simplement en choisir un dans la liste des ports disponibles.

Évidemment, vous déterminez cette liste au moment de l'exécution. En fait, avec les adaptateurs USB / série, vous pouvez envisager la possibilité que l'utilisateur ne découvre qu'après avoir démarré votre programme qu'il a oublié de connecter son adaptateur USB / série. Cela signifie que vous devriez relire cette liste chaque fois que vous affichez la boîte de dialogue de configuration. L’adaptateur USB n’est probablement pas COM1, BTW.

(Je ne peux pas garantir la qualité de la mise en oeuvre Mono de SerialPort. Une recherche rapide sur Google m'a laissé un peu inquiet, mais testez-vous)

J'ai jeté un coup d'oeil à cela et il semble que le code mono pour énumérer les ports série ne fonctionnera pas sur autre chose que Linux.

(à partir de mcs / class / 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 {

Sur OSX, je pense que vous pourriez probablement correspondre à /dev/tty.* (FreeBSD aurait besoin de / dev / ttyU [0-9] +)

Je ne peux pas dire que je suis épris de la façon dont il sélectionne le système d'exploitation sous lequel il fonctionne, non plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top