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.