Последовательный порт (RS232) в моно для нескольких платформ - PullRequest
3 голосов
/ 12 января 2009

Я планирую переписать приложение Win32 (родной C ++) в .NET - скорее всего, с использованием mono, чтобы я мог запустить его на Win32, Linux и Mac. Проблема, которую я пытаюсь решить (действительно разработанная только для Win32), связана с определением последовательного порта. Как обычно идентифицировать различия в платформе, когда предполагается, что должен быть только один исполняемый файл? В частности, COM-порт идентифицируется в Windows как COM1 или что-то в этом роде (\. \ COM), но в Linux они указываются как / dev / ttyS0.

Проверяет ли платформу во время выполнения эту информацию?

Я думаю, что единственная разница будет в открытии и закрытии порта. Чтение и письмо одинаковы.

Возможно, это более общий вопрос в том смысле, что он применим к любым платформенным компонентам в mono / .NET.

Как вы справляетесь с этим? В каком-либо строковом ресурсе или файле конфигурации, или жестко запрограммирован и переключаться на основе платформы времени выполнения?

Какой-нибудь пример кода для этого? Обратите внимание, я разработчик на C ++ и не знаком со всеми классами, доступными в .NET. Есть ли способ получить схему именования последовательного порта из CLR или есть способ получить ОС / платформу из CLR?

было бы неплохо, чтобы CLR могла представлять последовательные порты более независимым образом. Может быть, это невозможно.

Спасибо, Тим

EDIT

Учитывая один ответ до сих пор, я думаю, я должен просто попробовать
Сначала перечисление SerialPort.GetPortNames (), чтобы увидеть, работает ли оно. (на обеих платформах)

В win32 для более высоких номеров портов и, кроме того, USB-ключей - это не так просто, как перечисление базовых COM-портов.

Я сообщу о результатах здесь.

Ответы [ 3 ]

4 голосов
/ 12 января 2009

В .Net вам нужны System.IO.Ports. Такие имена, как «COM1» и «/ dev / ttyS0», являются случайными именами ОС. Зачем вам нужно жестко их кодировать? Пользователь должен просто выбрать один из списка доступных портов.

Очевидно, вы определяете этот список во время выполнения. Фактически, с адаптерами USB-to-serial вы можете рассмотреть возможность того, что пользователь обнаружит только после запуска вашей программы, что он забыл подключить свой адаптер USB-to-serial. Это означает, что вы должны перечитывать этот список каждый раз, когда вы показываете диалог конфигурации. Адаптер USB, скорее всего, не COM1, кстати.

(Я не могу ручаться за качество реализации SerialPort в Mono. Быстрый поиск в Google заставил меня немного волноваться, но проверьте себя)

3 голосов
/ 13 июля 2011

Я посмотрел на это, и кажется, что моно-код для перечисления последовательных портов не будет работать ни на чем, кроме Linux.

(из 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 {

В OSX, я думаю, вы могли бы сопоставить /dev/tty.* (FreeBSD потребуется / dev / ttyU [0-9] +)

Я не могу сказать, что я в восторге от того, как он выбирает, под какой ОС он работает ..

1 голос
/ 14 мая 2009

Только что открыл эту ветку и подумал, что должен добавить свои открытия: случайно, меня это тоже беспокоит на Mac. В Windows и Linux (как в VS, так и в Mono) SerialPort.GetPortNames () возвращает список со следующими правилами:

1) Windows возвращает список строк, таких как Com1, Com4, пропуская те, которые не существуют (USB-адаптеры последовательного порта, похоже, принимают номер COM на основе разъема, в который они последовательно подключены) Из моего сканера последовательного порта :

Scanning COM1 Scanning COM4 Scanning Complete

2) Linux возвращает все возможные tty последовательные порты, которые включен компилятором дистрибутива linux. Кажется, это примерно 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) Маки ...

О, дорогой, дорогой. Mac (когда подключен последовательный USB-порт и драйверы и все в порядке) не возвращает что-либо в GetPortNames (). Нада. Глядя в / dev / tty, дополнительные устройства появляются только тогда, когда устройство подключено и, к сожалению, имеет имена, такие как /dev/tty.usbserial-A7006Ro7, используя это имя в качестве аргумента программы, за которым следует serial.open dosnt иметь какой-либо эффект.

Глядя больше на это.

...