виртуальный последовательный порт socat и С# в Ubuntu Linux

для целей тестирования я пытаюсь написать простую программу, которая подключается к виртуальному последовательному порту, созданному с помощью socat.

Я создаю последовательный порт с помощью этой команды:

socat -d -d PTY,b9600 PTY,link=ttyVS1,b9600

получение этого вывода:

2011/11/08 18:26:31 socat[32708] N PTY is /dev/pts/1
2011/11/08 18:26:31 socat[32708] N PTY is /dev/pts/2
2011/11/08 18:26:31 socat[32708] N starting data transfer loop with FDs [3,3] and [5,5]

Когда я пытаюсь подключиться таким образом:

System.IO.Ports.SerialPort _port;
_port = new SerialPort("/dev/pts/1", 9600);
_port.Open();

Я получаю "имя файла неизвестно" System.IO.IOException.

Мне не хватает для установки DataBits, StopBits или других параметров? Как я могу узнать свойства, установленные socat? Или что не так с этим кодом?


person gsscoder    schedule 08.11.2011    source источник
comment
Ничего связанного, но просто упомянем, что на моем родном языке Сокат означает Отсталый =)   -  person Rosmarine Popcorn    schedule 08.11.2011


Ответы (1)


Что здесь не так, так это точно название устройства. Можете ли вы проверить в /dev, что /dev/pts/1 существует? Может быть, у него есть другое имя, например, /dev/pts1?

person Ignacio Soler Garcia    schedule 08.11.2011
comment
Я проверю и напишу здесь... Пока могу сказать, что я провел еще один тест с Windows, используя com0com (программное обеспечение виртуального последовательного порта). Я смог запустить два экземпляра одного и того же программного обеспечения (подключение без скорости передачи данных, только через порт) и обменяться данными! Я хочу сделать то же самое с Ubuntu Linux (а также с Mac OS X)... - person gsscoder; 08.11.2011
comment
В Linux проблема заключается в том, что даже если существуют оба /dev/pts/1 (и 2), когда я вызываю Serial.GetPortNames(), я не вижу /dev/pts/* в списке. Вероятно, среда выполнения Mono действует так же, как среда выполнения .NET, которая не может подключиться к порту, не названному COM* (для Linux может быть /dev/tty*, я не знаю!). Звучит правильно? (Могу ли я символическую ссылку решить проблему?) - person gsscoder; 08.11.2011
comment
Что у вас есть при вызове GetPortNames()? - person Ignacio Soler Garcia; 09.11.2011
comment
/dev/ttyS0 /dev/ttyS1 /dev/ttyS10 /dev/ttyS11 /dev/ttyS12 /dev/ttyS13 /dev/ttyS14 /dev/ttyS15 /dev/ttyS16 /dev/ttyS17 /dev/ttyS18 /dev/ttyS19 /dev /ttyS2 /dev/ttyS20 /dev/ttyS21 /dev/ttyS22 /dev/ttyS23 /dev/ttyS24 /dev/ttyS25 /dev/ttyS26 /dev/ttyS27 /dev/ttyS28 /dev/ttyS29 /dev/ttyS3 /dev/ttyS30 /dev/ttyS31 /dev/ttyS4 /dev/ttyS5 /dev/ttyS6 /dev/ttyS7 /dev/ttyS8 /dev/ttyS9 - person gsscoder; 09.11.2011
comment
Итак, нам нужно проверить 2 вещи. Или реализация последовательного порта Mono поддерживает только порты, начинающиеся с /dev/ttySx, или есть ошибка в методе (ммм... я не знаю, как код сможет узнать, что /dev/pts/1 в любом случае это последовательный порт ...). Можете ли вы изменить порт, который создает socat, на имя tty? или ссылка? или что-то подобное? Вы поняли... я не специалист по Linux... - person Ignacio Soler Garcia; 09.11.2011
comment
Я пробовал использовать символическую ссылку (sudo ln -s /dev/pts/1 /dev/ttyS20 после переименования /dev/ttyS20.old) для обоих устройств и получаю одно и то же исключение. Любая другая идея? Спасибо еще раз. - person gsscoder; 10.11.2011
comment
Почему бы и нет... Я опубликую здесь результаты! Спасибо за уделенное время. - person gsscoder; 10.11.2011
comment
Проголосовал! Я погружаюсь в исходный каталог mono/mcs/class/System/System.IO.Ports. SerialPort.Open (на SerialPort.cs) использует внутренний класс SerialPortStream. Этот последний тип использует внешний вызов, определенный как: [DllImport (MonoPosixHelper, SetLastError = true)] static extern int open_serial (string portName);. Теперь мы должны углубиться в этот API! - person gsscoder; 11.11.2011
comment
Надень свой неопреновый купальник ;) Удачи! - person Ignacio Soler Garcia; 11.11.2011
comment
Наконец-то всплыли! Интересующий нас код находится в этом месте исходного дерева: mono/support/serial.c. Здесь определен open_serial(char*), который выполняет простой вызов системы open(), например: open (devfile, O_RDWR | O_NOCTTY | O_NONBLOCK). open_serial() не проверяет формат параметра devfile. Возможно, что флаг O_NOCTTY задает файл устройства, а /dev/pts/1 созданный socat не распознается как файл устройства. Итак, проблема возвращается к socat: как запустить socat таким образом, чтобы создать допустимый файл устройства? - person gsscoder; 12.11.2011
comment
Я начал небольшую библиотеку с некоторым кодом для доступа к последовательным данным, https://github.com/gsscoder/libfoundation. Поддельное серийное устройство включено только для Windows (с использованием com0com). - person gsscoder; 14.11.2011
comment
Вы когда-нибудь находили решение для этого? Я тоже сталкиваюсь с этим. - person RobotCaleb; 04.04.2012