Moja aplikacja C# używa portów COM. Mam pewne trudności, które powinny być wspólne dla większości programów. Muszę uzyskać zdarzenie, gdy zmieni się lista nazw portowych. Mam pole wyboru, w którym użytkownik może wybrać listę dostępnych nazw portów. Czy ktoś ma fragment kodu do tego? Dziękuję Ci.Nowy dostępny port COM
Odpowiedz
Zmiana portów COM jest zjawiskiem rzadkim, a nie powszechnym.
Najprostszym sposobem jest posiadanie timera i co 10-30 sekund wylicza listę portów COM, a po zmianie, aktualizuje listę.
Jeszcze lepiej, zapewniają przycisk „Odśwież” - lista będzie w zasadzie tylko zmienić, jeśli użytkownik podłączony do USB Serial Adapter w
http://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devital pokaże Ci, jak słuchać zdarzeń podłączania/odłączania USB. Również 10-30 sekund to prawdopodobnie zbyt długo dla użytkownika, +1 głos dla przycisku odświeżania. – Simon
Tworzenie prostych aplikacji Form i umieścić następujący kod w postaci:.
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 537: //WM_DEVICECHANGE
var ports = SerialPort.GetPortNames().OrderBy(name => name);
foreach (var portName in ports)
{
Debug.Print(portName);
}
break;
}
base.WndProc(ref m);
}
Czy to działa wewnątrz pompy komunikatów usługi systemu Windows? System operacyjny: Win7. Jeśli nie, to w jaki sposób obejść ten problem? –
@AdrianSalazar: Nie wiem, nigdy nie próbowałem. Ale nie widzę żadnego powodu, dla którego nie powinien działać. Po prostu wypróbuj go, a jeśli to nie zadziała, poproś o nowe pytanie dotyczące problemu. – Oliver
Małe słowo "przesłonięcie" jest tym, o co się martwię. Nigdy nie widziałem tej konkretnej metody w usłudze Windows, więc zwracając uwagę, aby ją zastąpić. –
To może być również wykonane z pomocą "ManagementEventWatcher":
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Linq;
using System.Text;
using System.Management;
using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
namespace HmxFlashLoader
{
/// <summary>
/// Make sure you create this watcher in the UI thread if you are using the com port list in the UI
/// </summary>
[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public sealed class SerialPortWatcher : IDisposable
{
public SerialPortWatcher()
{
_taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
ComPorts = new ObservableCollection<string>(SerialPort.GetPortNames().OrderBy(s => s));
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent");
_watcher = new ManagementEventWatcher(query);
_watcher.EventArrived += (sender, eventArgs) => CheckForNewPorts(eventArgs);
_watcher.Start();
}
private void CheckForNewPorts(EventArrivedEventArgs args)
{
// do it async so it is performed in the UI thread if this class has been created in the UI thread
Task.Factory.StartNew(CheckForNewPortsAsync, CancellationToken.None, TaskCreationOptions.None, _taskScheduler);
}
private void CheckForNewPortsAsync()
{
IEnumerable<string> ports = SerialPort.GetPortNames().OrderBy(s => s);
foreach (string comPort in ComPorts)
{
if (!ports.Contains(comPort))
{
ComPorts.Remove(comPort);
}
}
foreach (var port in ports)
{
if (!ComPorts.Contains(port))
{
AddPort(port);
}
}
}
private void AddPort(string port)
{
for (int j = 0; j < ComPorts.Count; j++)
{
if (port.CompareTo(ComPorts[j]) < 0)
{
ComPorts.Insert(j, port);
break;
}
}
}
public ObservableCollection<string> ComPorts { get; private set; }
#region IDisposable Members
public void Dispose()
{
_watcher.Stop();
}
#endregion
private ManagementEventWatcher _watcher;
private TaskScheduler _taskScheduler;
}
}
- 1. Jakiej klasy USB używa port szeregowy COM?
- 2. Port USB na port szeregowy
- 3. Jak sprawdzić zdalny adres IP i port jest dostępny?
- 4. Określić, czy port szeregowy jest normalny COM lub SPP
- 5. Otwórz port COM w C++ z numerem wyższym niż 9
- 6. Windows 7 x64 COM/Port szeregowy Sniffer/Redirect
- 7. Port LWJGL do Androida
- 8. Port szeregowy lub port USB za pomocą D?
- 9. Port C++ AtomicLong.lazySet
- 10. W języku C# jak mogę odsłuchiwać port COM (seryjny), który jest już otwarty?
- 11. Wieloplatformowa alternatywa dla COM
- 12. Zapora sieciowa blokująca/odblokowująca port
- 13. Czy nowy biegacz scenariusza kątomierza Angulara jest nowy?
- 14. Dlaczego odmawia się dostępu do portu COM?
- 15. Jak określić port źródłowy pakietu UdpPacket?
- 16. nowy ObjectInputStream() blokuje
- 17. Budowanie aplikacji zgodnej z wcześniejszymi wersjami systemu OS X, gdy dostępny jest nowy interfejs API?
- 18. wirtualny port com0com nie został znaleziony
- 19. angularjs ForEach wcisnąć nowy element do obiektu
- 20. Mochiweb Port 80
- 21. HttpWebRequest Port Wyczerpanie
- 22. python ftplib podać port
- 23. Port dos2unix do brainfuck
- 24. CKAN port/Vagrant spedycja
- 25. Serial Port Cable Unplugged
- 26. Port Apache do przodu
- 27. Otwarty port w Ubuntu
- 28. Domyślny port Tensorflow Tensorboard
- 29. Czy dostępny jest prosty rejestrator kolorów dostępny dla Haskell?
- 30. Jak znaleźć plik php jest dostępny lub dostępny bezpośrednio?
Przypuszczam, że istnieje ogólne zdarzenie systemowe "nowe urządzenie USB" lub "nowe urządzenie PNP", które można było oglądać, ale może trzeba poczekać sekundę, aż urządzenie zakończy inicjowanie przed pojawieniem się nowych portów COM. – Rup
@Rup - Masz rację. Występuje opóźnienie między powiadomieniem urządzenia i kiedy System.IO.Ports.SerialPort.GetPortNames() odzwierciedli zmianę. Dlatego dobrze byłoby być powiadamianym, gdy lista zostanie zaktualizowana. – GTAE86