سؤال

وأنا على التخطيط على تطبيق Win32 (C ++ الأصلي) في. NET الكتابة إعادة - على الأرجح استخدام أحادي حتى أتمكن من تشغيله على Win32، لينكس وماك. المشكلة اني اسعى الى حل (بعد فقط وضعت حقا ل Win32) هي قضية مع تعريف المنفذ التسلسلي. كيف يمكن للمرء تحديد عادة الاختلافات في منصة عندما يكون هناك من المفترض أن تكون فقط للتنفيذ واحد. على وجه التحديد، يتم التعرف على منفذ COM في ويندوز كما COM1 أو شيء من هذا القبيل (\. \ COM) ولكن على لينكس وتحدد على أنها شيء من هذا القبيل / ديف / ttyS0.

هل احد تحقق المنصة في وقت التشغيل لهذه المعلومات؟

وأعتقد أن الفرق الوحيد سيكون في افتتاح واختتام الميناء. القراءة والكتابة هو نفسه.

وربما هذا هو السؤال أكثر عمومية في هذا الأمر ينطبق على أي الأشياء الخاصة بالنظام الأساسي في مونو / .NET.

وكيف تتعاملون مع ذلك؟ في بعض الموارد سلسلة أو ملف التكوين، أو الثابت ترميز والتبديل على أساس منصة وقت التشغيل؟

وأي نموذج التعليمات البرمجية لهذا؟ ملاحظة أم مطور C ++ ولم تكن مألوفة مع جميع الطبقات المتاحة في .NET. هل هناك طريقة للحصول على أي مخطط ميناء تسمية المسلسل من CLR أو هل هناك طريقة للحصول على OS / منصة من CLR؟

وكان يمكن أن يكون لطيفا لCLR ليكون قادرا على تقديم المنافذ التسلسلية بطريقة أكثر استقلالية. ربما لم يكن ذلك ممكنا.

وشكرا، تيم

وتحرير

وبالنظر إلى رد واحد حتى الآن أعتقد أنني يجب أن مجرد محاولة ل
SerialPort.GetPortNames () تعداد أولا لمعرفة ما اذا كان يعمل. (على كل المنابر)

في Win32 ل أرقام المنافذ أعلى وOFR دونجل USB - أنها ليست بهذه البساطة تعداد منفذ COM الأساسية.

وسأقدم تقريرا النتائج هنا.

هل كانت مفيدة؟

المحلول

وفقط اكتشفت هذا الموضوع، وأعتقد أنني البتة لمجرد إضافة اكتشافاتي: عشوائيا، وأنا أيضا قلق حول هذا الموضوع على لجنة الهدنة العسكرية. في نظام التشغيل Windows و Linux (في VS ومونو على حد سواء) SerialPort.GetPortNames () إرجاع قائمة، مع القواعد التالية:

1) إرجاع يندوز قائمة سلاسل مثل COM1، COM4، في عداد المفقودين أي التي لا وجود لها (يبدو USB التسلسلي محولات لاتخاذ عدد COM على أساس المكونات كانت موصولة إلى، اتساقا) من وجهة نظري الماسح الضوئي منفذ تسلسلي :

وScanning COM1 Scanning COM4 Scanning Complete

2) لينكس بإرجاع كافة ربما الكتابة البعيدة المنافذ التسلسلية التي مكنت المجمع من توزيعة لينكس. ويبدو أن هذا حوالي 8 منافذ، والتي إذا حاولت فتح، ورمي استثناء (من وجهة نظري الماسح الضوئي المنفذ التسلسلي:

و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) أجهزة ماكينتوش ...

ويا عزيزي يا عزيزي. أجهزة ماكينتوش (عندما يتم توصيل منفذ تسلسلي USB في والسائقين وكل شيء لا بأس) لا يعودون <م> أي شيء على GetPortNames (). ندى. أبحث في / ديف / الكتابة البعيدة، تظهر أجهزة إضافية فقط عندما يتم توصيل الجهاز في ولها أسماء مثل /dev/tty.usbserial-A7006Ro7 للأسف، وذلك باستخدام هذا الاسم كحجة لبرنامج تليها serial.open dosnt يبدو أن يكون له أي تأثير.

وتبحث أكثر في ذلك.

نصائح أخرى

في صافي، تحتاج System.IO.Ports. أسماء مثل "COM1" و "/ ديف / ttyS0" هي أسماء OS عشوائية. لماذا تحتاج إلى ترميز ثابت لهم؟ يجب على المستخدم اختيار واحد فقط من قائمة المنافذ المتاحة.

من الواضح أنك تحديد هذه القائمة في وقت التشغيل. في الواقع، مع محولات USB إلى المسلسل قد ترغب في النظر في إمكانية أن يكتشف المستخدم فقط بعد بدء البرنامج أنه نسي أن ربط له محول USB إلى المسلسل. وهذا يعني أنك يجب أن نعيد قراءة هذه القائمة في كل مرة تظهر لك مربع الحوار التكوين. محول USB من المرجح جدا لا COM1، راجع للشغل.

و(لا أستطيع أن أجزم بمدى جودة تنفيذ مونو من منفذ تسلسلي. بحث جوجل سريع ترك لي قلقا بعض الشيء، ولكن اختبار نفسك)

وكان لي نظرة على هذا ويبدو رمز أحادية تعداد المنافذ التسلسلية لن تعمل على أي شيء ولكن لينكس.

و(من MCS / فئة / النظام / 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 {

في OSX أود أن تعتقد أنك يمكن أن ربما تطابق /dev/tty.* (فري سيحتاج / ديف / ttyU [0-9] +)

لا أستطيع أن أقول أنا مفتون من الطريقة التي يختار الذي OS انها تعمل تحت إما ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top