私のC#アプリケーションはCOMポートを使用します。私はほとんどのプログラムに共通するべきいくつかの困難を抱えています。ポートネームのリストが変わったときにイベントを取得する必要があります。ユーザーが使用可能なポート名の一覧から選択できる選択ボックスがあります。誰にもこれのためのコードスニペットがありますか?ありがとうございました。新しいCOMポートの利用可能なイベント
答えて
COMポートの変更はまれなイベントですが、一般的なイベントではありません。
最も簡単な方法は、タイマーを設定し、10〜30秒ごとにCOMポートの一覧を列挙し、変更された場合はリストを更新することです。
ベターはまだ、「リフレッシュリスト」ボタンを提供 - ユーザーがUSBシリアルアダプタを接続した場合、リストは基本的にのみ変更されます
http://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devicesでは、USB接続/切断イベントをリッスンする方法が表示されます。また、ユーザーにとっては10〜30秒が長すぎる可能性があります。また、最新のボタンを押しても1票です。 – Simon
簡単なフォームアプリケーションを作成し、フォームに次のコードを置きます。:
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);
}
これはWindowsサービスメッセージポンプ内で動作しますか? OS:Win7。そうでない場合、回避策はありますか? –
@AdrianSalazar:わからない、試したことはありません。しかし、私はそれがうまくいかない理由は何も見ません。単に試してみてください。問題が解決しない場合は、新しい質問をしてください。 – Oliver
小さな「オーバーライド」キーワードは、私が心配しているキーワードです。この特定のメソッドをWindowsサービス内で見たことがないので、オーバーライドすることに注意してください。 –
:
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. Javaの利用可能なCOMポートをスキャンしてください。
- 2. コンボボックスに利用可能なCOMポートを追加する方法C#
- 3. comポートのイベント処理
- 4. 利用可能なフィルタリング利用可能なタスクグループ別のギャラリストタスク
- 5. 利用可能なポートにバインドする方法は?
- 6. Windows、WSH:ランダムに利用可能なポートを開きますか?
- 7. どのような新しいブラウザ機能が利用可能ですか?
- 8. ないパッケージのphp-opcache利用可能
- 9. jqGrid。イベントonSortCompleteが利用可能な場合
- 10. 利用可能なJavaScriptイベントを一覧表示するリファレンス?
- 11. Java - 利用可能なガベージコレクションアルゴリズム
- 12. 再利用可能なコントロール
- 13. 再利用可能なプリプロセッサ__COUNTER__
- 14. 再利用可能なコンポーネント
- 15. 利用可能なCRANビネット
- 16. 再利用可能なリモートモーダルレール
- 17. 次利用可能なID
- 18. 再利用可能な、
- 19. 利用可能なデータ
- 20. 再利用可能なコンポーネント
- 21. 再利用可能なビュー?
- 22. プロジェクトへのCOM参照の追加:VB.netで利用可能な参照のリストを更新するには?
- 23. 利用可能なプロキシIPとポートの一覧を列挙する方法
- 24. 利用可能なUSBポートのバージョンを確認する方法は?
- 25. Java COMポート読み取り書き込み可能
- 26. タイプセーフアクティベータが利用可能なコマンドラインオプション/機能
- 27. SF3:再利用可能なバンドルとモデルの更新
- 28. 利用可能なネットワークのリストを更新する - BroadcastReceiver
- 29. 利用可能なホットキーのクロスブラウザのリスト
- 30. テンソルの利用可能なグラフのリスト
一般的な「新しいUSBデバイス」または「新しいPNPデバイス」のシステムイベントがありますが、新しいCOMポートが表示される前にデバイスの初期化が完了するまで待つ必要があるかもしれません。 – Rup
@Rup - あなたは正しいです。デバイスの通知と、System.IO.Ports.SerialPort.GetPortNames()に変更が反映されるまでには時間差があります。そういうわけで、そのリストが更新されたときに通知を受けるのは本当にうれしいでしょう。 – GTAE86