C# открытие виртуального последовательного порта выдает ArgumentException

У меня есть утилита, которая подключается к устройству через последовательный порт. Для тестирования этого приложения я пишу симулятор для устройства.

Оба приложения предназначены для работы на одном компьютере с Windows 7.

Я пишу симулятор в C#. Я использовал com0com для создания пары виртуальных портов (в данном случае - CNCA8 и CNCB8, поскольку у меня уже есть несколько существующих пар).

Я пытаюсь открыть CNCB8 в симуляторе (приложение еще не запущено), и я получаю исключение:

Произошло необработанное исключение типа "System.ArgumentException" в System.dll

Дополнительная информация: данное имя порта не начинается с COM/com или не разрешается в действительный последовательный порт.

Образец кода:

        SerialPort port = new SerialPort("CNCB8", 9600, Parity.None, 8, StopBits.One);
        port.Handshake = Handshake.None;            
        port.Open();

Этот вопрос не актуален, так как это неиспользуемый виртуальный порт (IsOpen возвращает false, если это имеет значение): C# SerialPort # Open () метод генерирует ArgumentException из-за имени порта?

РЕДАКТИРОВАТЬ: Я также убедился, что имя порта отображается в SerialPort.GetPortNames(), и оно отображается в диспетчере устройств WIndows под "эмуляторы последовательного порта com0com". Я также попытался использовать CNCA вместо B (с несколькими различными существующими виртуальными портами), попытался удалить линию 'HandShake' и попытался изменить скорость передачи данных до 115200, на всякий случай (хотя в конечном счете мне нужно 9600 там).

1 ответ

Решение

Com0com позволяет редактировать имена портов. Это все еще происходит, если вы переименуете свою пару, скажем, в COM10 и COM11?

Кроме того, порты действительно живы? В Windows Server 2008 R2 нам пришлось выполнить команду bcdedit, о которой упоминается файл Com0com README, поскольку драйвер устройства не является доверенным для операционной системы.

Начиная с.NET Framework 4.7.2, SerialPort класс создает SerialStream экземпляр, в конструкторе которого есть следующий код:

if (portName == null || !portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
    throw new ArgumentException(...)

Печально, правда... с тех пор, как вызывается статический метод SerialPort.GetPortNames() с радостью возвращает массив строк {"COM1", "CNCA0", "CNCB0"}.

Мое решение такое же, как в ответе Яна Миллерса на переименование виртуальных COM-портов. Для этого я звоню

setupc.exe change CNCA0 Portame=COM8
setupc.exe change CNCB0 Portame=COM9

после установки com0com.

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