Последовательный порт (rs232) в моно для нескольких платформ

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

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

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

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

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

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

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

Спасибо, Тим

РЕДАКТИРОВАТЬ

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
9 452
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

Да, это «тревожный» факт о Linux и моно - причина, по которой я спрашивал. Я должен просто попробовать перечисление и посмотреть, работает ли оно.

Tim 12.01.2009 17:48
Ответ принят как подходящий

Только что обнаружил эту ветку, и подумал, что я должен просто добавить свои открытия: случайно, я тоже беспокоюсь об этом на 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 ...

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

Подробнее об этом.

спасибо за это дополнение. Этот проект застопорился, поскольку я не получаю много отзывов от пользователей, которые хотят использовать Mac или Linux. Я предполагал, что будет, но пока этот проект только для моего любопытства.

Tim 14.05.2009 22:45

Я смотрел на это, и мне кажется, что моно-код для перечисления последовательных портов не будет работать ни на чем, кроме 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] +)

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

Другие вопросы по теме