質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

18784閲覧

SerialPortクラスのWriteメソッドから抜けてこない

sato4000

総合スコア42

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

2クリップ

投稿2019/03/11 10:57

USBでデバイスと通信するプログラムを作成しています。
そのプログラムでSerialPortクラスを使用しているのですが、
SerialPortクラスのWriteメソッド(シリアル ポートの出力バッファーにデータを書き込む)
コールした後、たまに処理をずっと抜けない時があります。
本来はタイムアウトで例外が発生すると思うのですが、原因がわかりません。
USBケーブルを抜くと例外が発生します。
原因等わかる場合は、ご教示願います。

public void Write(string text);

例外
InvalidOperationException
指定したポートが開いていません。
ArgumentNullException
text は nullです。
TimeoutException
タイムアウト時間内に操作が完了しませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/03/11 11:56

環境は? Windows ??, Visual studio ?? USBデバイスは?
sato4000

2019/03/11 21:38

windows10 ProでVisual studio2017、intel(R) USB 3.0になります。
guest

回答4

0

ハンドシェイクありの場合

既に回答のある通りです。
参考: RtsEnable,DtrEnable,Handshake

ハンドシェイクなしの場合

ハンドシェイクなしの場合、シリアルポートは基本的にフロー制御が行われません。
原則、Write要求を行ったらすぐに書き込まれて、制御が戻ります。
しかし、com0com等の仮想シリアルポートドライバを介している場合、
Wirteが行われないことがあります。これは既定でTimeoutが無制限に設定されているためです。
ハンドシェイクなしで、戻ってこない等のケースがある場合は、USBシリアルケーブルを変更してみる等の対応を行ったほうが良いです。(FTDI製のチップで問題になったことはない)
※このケースはレアなので、サポート対象外にした記憶があります

備考

以下は経験ですので参考にしないでください:
.NET の SerialPortクラスは非常に便利で薄いAPIですが、
薄いことにより、予期せぬタイミングでInvalidArgumentExceptionなどの
例外が発生することがあります。適切にCatchしようとすると、大変ですので、
ある程度割り切るほうが良いかもしれません。

投稿2019/03/11 17:18

testset

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sato4000

2019/03/11 21:41

ご回答いただきありがとうございます。 ケーブルを変更して別途試してみます。
guest

0

Handshakeプロパティはどうなってるでしょうか。これをNoneにしておけばそのようなことはなくなります

このハンドシェイクによって送信が禁止されると、送信が完了しないため止まってしまいますね

投稿2019/03/11 11:51

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sato4000

2019/03/11 21:39

ご回答いただきありがとうございます。 確認しましたがHandshakeプロパティはnoneになっていました。
y_waiwai

2019/03/11 22:13 編集

PortNameは実在してるのか、あるいはその通信先のポートがきちんと動作してるのか。 その他Serialportの設定に不正なものがないかチェックしてみる ってことぐらいですね 特に通信の相手方に問題ないのか確かめることですねー
sato4000

2019/03/13 03:37

返信いただきありがとうございます。 上記調査してみます。 たしかに通信相手は怪しいのですが、止まってしまうとこちらが悪いことになりそうで。
guest

0

ベストアンサー

フリーズしてる感じですか?
電文は送られてるけど相手に届いてないって感じですか?
そこから再開もままならない状態ですか?
私も昔悩んで結局分からなかったんですよね。
USB-シリアル変換ケーブルや、RS-232cでも拡張ボードでやるとある程度はやり取りできるんですが
突然通信不能になっちゃうんですよね。
もちろんうまくいく物もあるんですが時々ね。
(プログラムは変えてないけど物を交換するだけで症状が出る)

WriteTimeoutとReadTimeoutプロパティは確かデフォルトでInfiniteTimeout(-1)となっていたと
思うのですが-1(タイムアウトが発生しない)以外にしていますよね。
※電文を送った後にレスポンスが返ってくるまでの間のタイムアウトはこれではキャッチできなかったはずですが一応。

お力になれませんが、できるならUSB変換ケーブルは極力使わず拡張ボードではなくオンボードについているのを使った方が無難な気がします。

投稿2019/03/12 12:27

編集2019/03/12 12:32
shinami

総合スコア334

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/03/12 12:58

今どき、オンボードのシリアルポートのついたPCなんて、FA用を別にしてあるのでしょうか? 一般的には入手困難かと思います。 以前、使った限りでは、USBシリアルでも十分に使えました。(相手がタイミングに敏感な機器でした) ただし、速度は 19.2Kまででしたが。
shinami

2019/03/12 13:11

シリアルポートについてですね。今時は一般的には無いですね。 FA用で、それでも少し昔の型ですかね。 中には4つぐらい付いているのもありますよ。 私個人で使ってるマザーボードも3、4年前ぐらいでしたけど2つ付いてますよ。 >USBシリアル変換 そうなんですね。私のが運が悪かったんですかね。今となっては分かりませんが
pepperleaf

2019/03/12 14:07

USBシリアル、当たり外れが大きかったです。最初、理由が分からず、何種類かテストして原因(フロー制御)が分かりました。(国内品、NG率高かった)
sato4000

2019/03/13 03:51

ご回答いただきありがとうございます! WriteTimeoutとReadTimeoutプロパティがデフォルトになっていました。 現在物がないため別途動作確認してみます!
shinami

2019/03/13 08:31

pepperleafさん やはり当たり外れがあるんですねぇ。 sato4000さん そのプロパティを変えてどうなるか分かりませんが一応。
pepperleaf

2019/03/13 11:04

ディフォルトって、Timeout無しじゃなかったか?
sato4000

2019/03/13 23:35

ありがとうございます。 無事タイムアウトすることを確認いたしました。
guest

0

USB-シリアルの変換ケーブルを使っているという事でしょうか。
昔、使った事がありましたが、結構、製品のばらつき(正確には仕様に差)がありました。
別の方が書いているように、FTDIのチップを使っているのは、問題が無かった、、、と言うより、フロー制御が行われていました。 他のは要注意。

結局、使っているケーブルの仕様を確認し、検索とかもして、使えるケーブルを調べたのは、もう何年前だったでしょうか。
(当時、対象とする機器がフロー制御が必須だったので)

あと、どう制御しているか、実際のコードも提示した方が正確な情報が得られると思います。

参考までに。

投稿2019/03/12 11:10

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sato4000

2019/03/13 03:56

ご回答いただきありがとうございます! USB-シリアルの変換ケーブルは使用していません。 FTDIのチップを使用しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問