C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

シリアルポートの再オープンについて

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■92448 / inTopicNo.1)  シリアルポートの再オープンについて
  
□投稿者/ つけぺん (7回)-(2019/09/26(Thu) 16:02:54)

分類:[C#] 

こんにちは。

windows PCにFT232のようなUSB/UARTを接続して、C#プログラムから使用しています。

通常は、USB/UARTを接続した状態でプログラムを起動し、初期設定でserialPort1.Open()
を実行して、シリアルポートをOPENしています。

ただ、途中でUSBが抜けてしまい、再度USBを挿した場合、どのように再接続を検知し、
再度シリアルポートをOPENすればよろしいでしょうか。
また、USBが抜けてしまい、シリアルポートがCLOSEしたことを検知することは
可能でしょうか。

以上、ご存知の方がおりましたら、ご教授いただければ幸いです。

引用返信 編集キー/
■92451 / inTopicNo.2)  Re[1]: シリアルポートの再オープンについて
□投稿者/ 774RR (731回)-(2019/09/26(Thu) 16:35:24)
plug/unplug は WM_DEVICECHANGE で通知されるのでトップレベルウインドウでハンドルすれば良いんだけど
開いたままのデバイスを強制 unplug したときどう動くかはデバイスドライバの出来次第。
- unplug された状態で既にオープンしているハンドルが正しく Close() できるかどうか
- unplug/plug で再度正しく Open() できるかどうか
- COMx の番号として同じ値が割り振られるかどうか
は、やってみないとわからないっす。

まずは Plug/Unplug の検出をできるようにしてみよう。
C# FormApp なら Form1.WndProc() を override して WM_DEVICECHANGE を受け取ってみよう。
Win32API RegisterDeviceNotificationW() を呼ばずに WM_DEVICECHANGE をハンドルすると
DBT_DEVNODES_CHANGED しか受け取れないのでその辺は妥協するか
RegisterDeviceNotificationW() を正しく呼んで DBT_DEVICEARRIVAL や DBT_DEVICEREMOVECOMPLETE を受け取れるようにするかはあなた次第。

DBT_DEVICEREMOVECOMPLETE で SerialPort.Close() してみるとか
DBT_DEVICEARRIVAL で SerialPort.Open() してみるとか
この辺から手を付けてみるとよいかもしんまい。
引用返信 編集キー/
■92452 / inTopicNo.3)  Re[1]: シリアルポートの再オープンについて
□投稿者/ kiku (136回)-(2019/09/26(Thu) 16:42:14)
No92448 (つけぺん さん) に返信
> ただ、途中でUSBが抜けてしまい、再度USBを挿した場合、どのように再接続を検知し、
> 再度シリアルポートをOPENすればよろしいでしょうか。

ハードウェアとしてUSB接続し、
アプリからはCOM接続するということは、
USBをCOMに変換するドライバが存在すると思います。

RS-232Cポートが存在するPCであった場合、
ドライバは必要なく、COM1だったり、COM2だったりと
固定で割り振られていると思います。

実験してみればわかりますが、
USBに何も接続していない状態で、
ドライバが導入されている場合、
手元にあるドライバでは、COMが見えている状態であるため、
アプリからCOMをオープンすると
オープンできてしまいます。

なので、ドライバによるかもしれませんが、
理論上、USB接続の切断を検知できないということになります。

まずは利用するドライバを導入し、実験することをお勧めします。

仮に検知できないとした場合、
どのように接続されていないことを検知するのかですが、
USBに接続されている機器により、できる出来ないが決まります。

例1
 1秒間隔に、USB機器がデータを送信する機能があるのではあるならば、
 データが来なくなったら、切断されたと判断しても良いかもしれません。

例2
 PC側からあるコマンドを送ると、USB機器から返答があるルールがあった場合、
 これを利用することで、切断されたと判断することができるかもしれません。

> また、USBが抜けてしまい、シリアルポートがCLOSEしたことを検知することは
> 可能でしょうか。

USBが抜けると、自動的にCOMがクローズされることはありません。
COMのクローズはアプリが制御します。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ