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

わんくま同盟

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

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


■93206 / )  Re[3]: シリアル通信で送信をコントロールする方法について
□投稿者/ たれパンダ (3回)-(2019/11/28(Thu) 01:02:48)
No93156 (sima さん) に返信

> ケーブルの配線などに問題がないようですなどどいうような
> 貴方の解釈ではなく、CTS,RTS,DTR,DSR の制御が使える配線になっている信号ケーブルなのかを示して下さい。
>
> 次に DTR,DSR が互いのPCで使える設定になってるのかも示して下さい。
>
> 相手の DTR を無視するというのは垂れ流しなので、相手が受信可能(電源が入っていて通信可能)だと確実にわかっている場合に
> 用いる方式です。
> 相手の装置が生きていることを確認したうえで送信側は CTS/RTS を使って通信可能なことを相手に知らせ、
> 相手が受信可能なことを確かめた上で、初めて送受信開始できる状態だと知るのが普通だと私は思っています
>
> なので、これらの信号線がどうつながっているのかが分からないとプログラムのコードから判断するのは
> 無理があると考えます
>
> また、相手の装置がモデムの振りをする場合(制御線の使い方です)は RI,DCD も見た方がいい場合があります。


返信が遅くなりすみません
当初は RTS/CTSでフロー制御するつもりで RTS/CTSが
お互いにクロスしたケーブルを自作していたのですがそれでも
全くフロー制御ができず、通信に失敗していました。

現在の結線は以下のようになっています。
SANWA KR-X03という市販のクロスケーブルです。

TxD ─── RxD
RxD ─── TxD
DSR ─── DTR
DTR ─── DSR
RTS ┬── DCD
CTS ┘
DCD ──┬ RTS
    └ CTS
GND ─── GND


上記のケーブルは RTS/CTSがお互いに自分側でショートしているので
以下のように XON/XOFF で通信を試みています。
serialPort1.Handshake = Handshake.XOnXOff;

続けて

serialPort1.RtsEnable = true;
serialPort1.DtrEnable = true;

serialPort1.Open();

この状態で

相手端末(NC工作機)側でリードを開始

こちらから書込み

serialPort1.Write(ByteData, 0, iCnt);

で相手端末にデータは流れていくようになったのですが
フロー制御が全く効いていないようで相手端末がバッファ
オーバーフローでアラームを出してしまいます。

送信データの進捗をみるためデータをテキストボックスに
表示していますが流れ方を見ると

何回かに1回は明らかにフロー制御が効いているような
不規則なスピードのスクロールになることがあるのですが
ほとんどは猛烈な勢いでデータが流れて相手が取りこぼす
状態になります。

どんなときにも送信時はこちら側には何のデータの受信もないので
相手端末は XON/OFF が無効なのかもしれません


対症療法的には最悪なコーディングですが
serialPort1.Write(ByteData, 0, iCnt);
Thread.Sleep(100);

とすることで送れないことはないのですがなんとかフロー制御をしたいと
考えています。

上記の条件でフロー制御するにはどのような方法があるのでしょうか
何かヒントでもご紹介いただければ助かります。
よろしくおねがいします。









返信 編集キー/


管理者用

- Child Tree -