2015-08-16 7 views
7

Хотя C# не является моим основным языком программирования, я поддерживаю такую ​​программу уже пару лет. Эта программа подключается к устройству на последовательном порту и работает от Windows XP до версии 8.1. Одна конкретная «функция» заключается в том, что она использует .NET Framework 2.0.SerialPort.GetPortNames() возвращает неправильные имена портов

С некоторыми пользователями, обновляющимися до Windows 10, мы жалуемся, что программа не может обнаружить/открыть COM-порт устройства. Мы подтвердили это на наших собственных тестовых системах с чистой установкой Win10.

Оказалось, что функция SerialPort.GetPortNames() возвращает неправильные имена портов и добавляет «странные» символы после имени порта. Например:

  • COM3 吀
  • COM3 䡢
  • COM3 ゠

Etc. Когда я обновить список, каждый раз, когда другой персонаж (или два) показывает вверх после номера. тест код супер прост:

string[] portNames = System.IO.Ports.SerialPort.GetPortNames(); 
    log("Available ports:"); 
    foreach (string PortAvailable in portNames) 
    { 
    log(PortAvailable); 
    } 

Если логарифмическая функция mearly добавляет строку в стандартный TextBox на форме:

txtLog.Text += Msg + Environment.NewLine; 

Это работает в любой другой версии Windows. Я проверил реестр, и все выглядит хорошо там. Есть ли у кого-нибудь идеи об этом?

Я подозреваю, что .NET Framework 2.0 на 100% не совместим, хотя вы можете включить его в функциях Windows, и кажется, что сама программа работает нормально (помимо проблемы с последовательным портом). Мне немного страшно обновляться до более новой .NET, не говоря уже о том, что у нас есть VisualStudio 2008 для C# (max = .NET 3.5). Обратите внимание, что программа все равно должна работать и в Windows XP (POS-версия по-прежнему поддерживается Microsoft).

ADDED: Я «обновил» тестовую программу до .NET 3.5 и по-прежнему имею точно такую ​​же проблему. Следующий шаг - установить новый VisualStudio (кажется, что он свободен в настоящее время? Должен ли я проверить настройки конфиденциальности в Studio также? ;-).

ADDED 2: Установил VisualStudio 2015 и сделал несколько сборок с различными версиями .NET Framework. v2.0 и 3.5, все еще добавляя странный символ. Но в версии 4.0 и выше этот вопрос, похоже, будет решен! Теперь, чтобы исходная программа была скомпилирована и работала над новой Framework. Но я нахожу эту проблему очень странной и ожидаю, что это затронет больше функций .NET и больше программ.

+0

Я думаю, что пришло время обновиться до .net 4 человека, действительно, это также время прекратить поддержку winxp, не быть той компанией, которая все еще работает win3.1 ....... force ваших клиентов, чтобы обновить, если они запускали 7? хорошо, но xp? Cегодня? Кроме того, вам не нужно их принуждать, просто установите установщик .net 4 с вашим следующим обновлением. –

+1

Мы говорим о розничных продавцах, используя Windows XP POS, который по-прежнему поддерживается Microsoft. И текущее программное обеспечение некоторых, вероятно, даже не будет работать на новой версии Windows. Поскольку мы поставляем только небольшое дополнение к их системе, мы не можем никого принуждать :-(... Если MS поддерживает .NET 3.5 на Win10, тогда они должны исправить ошибки. – msoft

+0

У вас есть точка здесь, но все же. я бы предложил инвестировать в команду, чтобы медленно обновлять ваше программное обеспечение до версии new.net. Не нужно спешить с ним. Но будьте готовы, когда придет время –

ответ

6

Я тоже видел странные символы. Мое решение использует регулярные выражения, чтобы отфильтровать номер части имени коммуникационного порта.

Dim ports As New Devices.Ports 
For Each s As String In ports.SerialPortNames 
    s = Regex.Replace(s, "\D*(\d+)\D*", "$1") 
    Debug.WriteLine(s) 
Next 
+1

Спасибо за подтверждение. Так что это действительно ошибка Microsoft, мне любопытно, что другие функции .NET имеют аналогичную проблему. Реальное решение здесь заключалось бы в том, что они решают это, но не дождаться этого. Хотя использование .NET Framework 4, вероятно, было бы лучшим решением, мы решили фильтровать имя порта. Таким образом, мы все еще можем обслуживать пользователей Windows XP, и нам не нужно тестировать все детали программного обеспечения в отношении новой версии .NET. Поэтому я задал этот ответ как решение для нас. – msoft

+0

Случайный мусорный персонаж довольно часто бывает другой цифрой, поэтому, хотя это регулярное выражение доставит вам большую часть пути, оно не полностью надежное. – sstteevvee

1

Как вы говорите, что программа работает после включения окна особенности:

.NET 2.0,3.0,3.5 не включен по умолчанию в Windows 8/8,1/10. Файлы не хранятся на установочном носителе/​​wim.

Он может быть активирован командой DISM из обновления Windows или локального источника.

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All 
+0

Нет, это не оно. Программа не работает вообще без .NET 2.0, что очевидно. Установка не позволяет нам установить ее вообще. С .NET 2.0 функция возвращает неверные значения, как указано в вопросе. – msoft

1

проверить это: http://forums.radioreference.com/uniden-tech-support/317887-windows-10-uniden-usb-driver-5.html Для работы вокруг, чтобы закрепить последовательный порт Win 10 не работает, вызванный странными символами после имени порта.

  1. Зайдите в реестр с помощью regedit.exe.
  2. Перейдите к «HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALC OMM»
  3. Обратите внимание на название коммуникационного порта.
  4. Добавить «0» или любой символ в имя коммуникационного порта.
  5. Измените имя коммуникационного порта обратно к тому, что он был в шаге 3.

Он работал для меня. Baldur

+0

Спасибо за вход, он уверен, что это решение для конечного пользователя с небольшим опытом работы с реестром (как, например, большинство посетителей stackoverflow; ;-). Но как поставщик программного обеспечения мы не можем просить наших пользователей взломать их настройки. Я также предполагаю, что временно, когда подключение новых устройств (или иногда использование другого порта) снова приводит к поврежденным именам портов. MS должна это исправить, но на данный момент принятое решение зарекомендовало себя в этой области. – msoft

0
string[] ports = SerialPort.GetPortNames(); 

     for (int i = 0; i<ports.Length;i++) 
     { 
      string mystr = ports[i]; 
      if (((mystr[mystr.Length-1]) >= 0x30) & ((mystr[mystr.Length-1]) <= 0x39)) 
      { 

      } 
      else 
      { 
       mystr = mystr.Remove(mystr.Length-1); 
      } 
      ports[i] = mystr; 
     } 
+0

Добро пожаловать в StackOverflow. Потребуем минутку, чтобы добавить объяснение в свое предложение ответа. – Burki

+0

Спасибо за ваш вклад. Это в основном то же самое, что и Regex из принятого ответа, но больше кода и меньше производительности. Поэтому я не вижу никакого преимущества здесь. – msoft

2

Я имел точно такую ​​же проблему с USB CDC последовательными устройствами, обрабатываемое новый переписанный Windows 10 драйвер Usbser.sys.

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

https://social.msdn.microsoft.com/Forums/vstudio/en-US/a78b4668-ebb6-46aa-9985-ec41667abdde/ioportsserialportgetportnames-registrykeygetvalue-corruption-with-usbsersys-driver-on-windows?forum=netfxbcl

..there это код, что там будет проходить через реестр, найти usbser порты, и вернуть их unmangled имена. Помните, что он не возвращает все последовательные порты, только те, которые предоставляются этим драйвером. Код работает в Windows XP до 10.

Основная проблема заключается в том, что драйвер usbser.sys создает запись в реестре, а на .NET (по крайней мере, до 3,5) функция GetPortNames() пытается прочитать эти реестры ключи и получает поврежденные данные. Я сообщил об этом Microsoft, как через этот форум (при условии, что они его прочитали), так и с помощью встроенного средства для создания отчетов об ошибках Windows 10. Может быть, однажды будет исправление.

+0

Большое спасибо за дополнительную информацию, более подробную информацию и сообщение об ошибке. Насколько я видел, символы мусора - это главным образом символы юникода. Запуск в поле в течение некоторого времени теперь в нескольких местах без проблем, поэтому они также имеют нецифровые символы. Но я согласен с тем, что это не надежный способ и заглянет в ваш пост msdn. – msoft

+0

Я согласен, что его обычно символы Юникода, или латинские буквы, но на моей машине разработки я регулярно наблюдал цифры (возможно, 1 раз в 10 раз!). Я не был достаточно храбр, чтобы отправить наш продукт с такими разновидностями , поэтому я сосредоточился на более сложном, но надежном решении. :) – sstteevvee