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

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

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

Re[7]: シリアルケーブルが途中で抜いた時の判断について


(過去ログ 139 を表示中)

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

■81777 / inTopicNo.1)  シリアルケーブルが途中で抜いた時の判断について
  
□投稿者/ JYK (1回)-(2016/11/13(Sun) 22:45:58)

分類:[.NET 全般] 

Visual Basic 2010
OS:Windows7
でシリアル通信を下記のイベントで行っています。

private Sub OnSerialReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
{


}

そこで質問ですがシリアルが接続状態で通信している間に
シリアルケーブルを抜いて切断を検出するには、どのようなイベントまた、メソッドを利用すればいいのでしょうか?
ISOpenメソッドでは、OnDataReceivedイベント内では、確認が取れませんでした。

お手数ですがご回答のほどをよろしくお願います。



引用返信 編集キー/
■81778 / inTopicNo.2)  Re[1]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ しま (116回)-(2016/11/14(Mon) 00:17:30)
No81777 (JYK さん) に返信
> Visual Basic 2010
> OS:Windows7
> でシリアル通信を下記のイベントで行っています。
>
> そこで質問ですがシリアルが接続状態で通信している間に
> シリアルケーブルを抜いて切断を検出するには、どのようなイベントまた、メソッドを利用すればいいのでしょうか?

線が抜けたかどうかではなく、通信相手の装置と通信できない状態のひとつが線が抜ける、抜き取る場合だと考えます
この場合、
1)ブレークが発生する
2)CD(Carrier Detect) が落ちる、つまり変化する
3)DSR(Data Set Ready) が落ちる、つまり変化する
4)CTS(Clear To Send) が落ちる、つまり変化する
ことで検出可能だと考えますが、相手の装置がどういう振る舞いをし、あなたが用いている結線が適切かどうかで
変わってきますので場合により上手く検出できないこともあるでしょう。


引用返信 編集キー/
■81779 / inTopicNo.3)  Re[2]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ 774RR (457回)-(2016/11/14(Mon) 10:49:10)
USB も PCI-ex も「シリアル通信」なわけで、ここは EIA574 とか RS232 とか書いて欲しいとこだが:

しまさんが既に書かれているんですが

EIA574 (RS232) ってのはハードウエア構成上「抜けた」を知る手段は無い、というか
「抜けたら**になる」ように機器仕様、ケーブル仕様を策定する必要があるわけです。

ウチなんかでは TXD/RXD/GND しかつながない機器+ケーブルなんてのを多用していて、
そういう構成だと原理的に「抜けた」ことを知ることはできないのです。

抜けたら RTS/CTS が変化するように機器・ケーブルを作れば RTS/CTS 変化で
抜けたら DSR/DTR が変化するように機器・ケーブルを作れば DSR/DTR 変化で
検出することができるはずです。

第三者に使わせるソフト(そのユーザがどんなケーブルを使うか事前に予測できない)である場合は
着脱検出はあっさりあきらめるほうが話が早いっす。
タイムアウト判定するくらいしか手は無いってことで。

引用返信 編集キー/
■81795 / inTopicNo.4)  Re[3]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ JYK (2回)-(2016/11/14(Mon) 23:29:31)
No81779 (774RR さん) に返信
> USB も PCI-ex も「シリアル通信」なわけで、ここは EIA574 とか RS232 とか書いて欲しいとこだが:
>
> しまさんが既に書かれているんですが
>
> EIA574 (RS232) ってのはハードウエア構成上「抜けた」を知る手段は無い、というか
> 「抜けたら**になる」ように機器仕様、ケーブル仕様を策定する必要があるわけです。
>
> ウチなんかでは TXD/RXD/GND しかつながない機器+ケーブルなんてのを多用していて、
> そういう構成だと原理的に「抜けた」ことを知ることはできないのです。
>
> 抜けたら RTS/CTS が変化するように機器・ケーブルを作れば RTS/CTS 変化で
> 抜けたら DSR/DTR が変化するように機器・ケーブルを作れば DSR/DTR 変化で
> 検出することができるはずです。
>
> 第三者に使わせるソフト(そのユーザがどんなケーブルを使うか事前に予測できない)である場合は
> 着脱検出はあっさりあきらめるほうが話が早いっす。
> タイムアウト判定するくらいしか手は無いってことで。
>
RS232Cケーブルです。

usb-rs232cだったらUnauthorizedAccessExceptionという例外でとらえることが出来ますが
RS232Cケーブルを抜いた時のイベントを捕まえるものとかは、ないのでしょうか?」



引用返信 編集キー/
■81796 / inTopicNo.5)  Re[4]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ Azulean (732回)-(2016/11/15(Tue) 06:20:36)
No81795 (JYK さん) に返信
> usb-rs232cだったらUnauthorizedAccessExceptionという例外でとらえることが出来ますが
> RS232Cケーブルを抜いた時のイベントを捕まえるものとかは、ないのでしょうか?」

USB 変換のケーブルの類いは、変換部分が USB なので知ることができるというだけであり、RS232C そのものの機能ではありません。
引用返信 編集キー/
■81797 / inTopicNo.6)  Re[5]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ 774RR (460回)-(2016/11/15(Tue) 08:49:23)
既に書いているとおり

・全ての機器・ケーブルで着脱を知ることはできない(ハードウエアにそういう仕組みが無い)
・そういうふうに機器・ケーブルを作れば
 SerialPort.PinChanged イベントで SerialPinChange.CtsChanged ないし SerialPinChange.DsrChanged で
 知ることができる(はず)

です。

EIA574 仕様上の意味論的には「着脱判定」には DSR を使うべきでしょう。
機器とケーブルの両方が DSR/DTR をサポートしてないと使えませんけど。

# オイラならイベントで通知してもらうことは最初から期待しない(ハードウエア仕様上無理)ので
# タイムアウトで判定のみとする。
引用返信 編集キー/
■81809 / inTopicNo.7)  Re[6]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ JYK (3回)-(2016/11/15(Tue) 22:59:16)
No81797 (774RR さん) に返信
> 既に書いているとおり
>
> ・全ての機器・ケーブルで着脱を知ることはできない(ハードウエアにそういう仕組みが無い)
> ・そういうふうに機器・ケーブルを作れば
>  SerialPort.PinChanged イベントで SerialPinChange.CtsChanged ないし SerialPinChange.DsrChanged で
>  知ることができる(はず)
>
> です。
>
> EIA574 仕様上の意味論的には「着脱判定」には DSR を使うべきでしょう。
> 機器とケーブルの両方が DSR/DTR をサポートしてないと使えませんけど。
>
> # オイラならイベントで通知してもらうことは最初から期待しない(ハードウエア仕様上無理)ので
> # タイムアウトで判定のみとする。

使用しているのは、通常の市販のシリアルケーブルRS232Cです。
引用返信 編集キー/
■81811 / inTopicNo.8)  Re[7]: シリアルケーブルが途中で抜いた時の判断について
□投稿者/ 774RR (461回)-(2016/11/16(Wed) 10:13:40)
もう答えは書いちゃったのであとは実装するだけでないの?

ソフトウエアで、っつか、我々末端プログラマができるのは
private void serialPort1_PinChanged(object sender, System.IO.Ports.SerialPinChangedEventArgs e)
を捕まえることだけ。
それで DsrChanged が来ないのならハードウエア側の是正が必要ってことで。

オイラんとこの RXD/TXD/GND だけ接続ケーブルなら当然 PinChange は発生しないっす。
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -