画像ファイル
画像ファイル RS-232C RS-232Cの基礎
RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル


RS-232Cピン配置
標準のRS-232C 9ピンコネクタのピン配置を示します。
RS-232Cのケーブルには25ピンの物も有りますが、最近はPCの小型かに伴い
25ピンはかなり少なくなって来ましたので、 25ピンの説明は省きます。
INと書かれているのは信号を受ける側で、OUTと書かれているのは信号を出す側です。
このうちRxDとTxDはパルスでその他はレベルになります。(ただしCDCとRIは除いてあります。)
信号名の説明はこの下のクロスケーブルを例に説明した方がわかり易いので、下をご覧下さい。
ピンNo 信号名 入出力 内容
1 CD IN キャリア検出
2 RxD IN 受信データ
3 TxD OUT 送信データ
4 DTR OUT データ端末レディ
5 GND - グランド
6 DSR IN データセットレディ
7 RTS OUT 送信リクエスト
8 CTS IN 送信可
9 RI IN 被呼表示

クロスケーブルのピン配置
RS-232Cの9ピンのケーブルは大きく分けて2種類あります。
一つはストレートケーブル(ノーマル)を呼ばれるもので、両側のコネクタが信号線(電線)により
両端の同じピンに接続されています。
これはPCとモデムなどを接続するもので、RS-232Cでコマンドをやり取りする機器なども
殆どの場合このケーブルを使用します。
もう一つはクロスケーブル(リバース)と呼ばれる物で両側のコネクタに接続される線が一部、
クロスしています。
このケーブルは通常はPCとPCを繋ぐものです。
下にクロスケーブルのピン配置を示します。
ピン番号 信号名 接続 信号名 ピン番号
1 CD CD 1
2 RXD - TXD 3
3 TXD - RXD 2
4 DTR - DSR 6
5 GND - GND 5
6 DSR - DTR 4
7 RTS - CTS 8
8 CTS - RTS 7
9 RI RI 9


各ピンの説明

未接続のピン 1番、9番
1番と9番ピンですが通常は繋がれていません。

データ送受信の為のピン 2番、3番
次に2番ピンと3番ピンがクロス接続されています、2番ピンで受信データー、3番ピンは送信データです。
受信データのPC側はRS-232Cのハードウェアを通して受信バッファに繋がっています。
送信データのPC側はRs-232Cのハードウェアを通して送信バッファに繋がっています。
この線がクロス接続されることにより2台のPCの送受信(双方向)が可能になります。
実はこの線とアース線が3本あれば簡単なRS-232Cの通信は可能になります。
簡単とはデータのフロー制御や相手の電源が入っている否かのチェックを行なわないということです。

更に通信が一方向であれば、RxDとTxDを結ぶ線とグランド線の2本有れば通信が可能です。
例えば1秒毎に温度のデータをRS-232Cで送ってくる温度計が有ったとします、この場合はデータは
一方通行ですし、送られるデータ量も少ないので、2本の線で十分でしょう。

相手の状態を知るピン DTR、DSR 4番、6番
それではそのほかの線は何の為に有るのでしょうか?
PC間のデータ通信をする際に受信側のコンピュータの電源がOFFになっていたらどうなるでしょうか?
2本線の通信では送信側で受信側の状態を知ることは出来ません。
3本線の通信では双方が送受信出来ますから、当然来るべきデータが来ない場合、相手のコンピュータ
に異常が有ると言う判断は可能になります。
ただしこの場合は、何もしないでも相手がデータを送ってくるか、又はこちらから返事を返してください
と言うコマンドを相手に送信する必要が有ります。
この問題を解決するのが、DTR、DSRですDTRはPCが通信可能で有れば電圧レベルがHighになり
通信不可の状態ならばLowになります。
DTR、DSRはクロス接続されていますから、データを送ろうとするPCはDSRの状態を見て、相手のコンピューター
に異常が有った時は、ワーニングを出すなどの処理が可能となります。
ここまでの説明で、PCの双方向通信では相手のPCの状態を見ながら通信するために、
5本の線が必要になることは理解されたでしょうか。

データバッファの状態を伝える RTS、CTS 7番、8番
ただしこれだけでは完全ではありません、もし送信データ量が大きいかあるいは、通信速度が速い為に、
データ受信側のコンピューターの受信バッファからのデータ取得処理が、間に合わ無かったらどうなるのでしょうか?
このは状態を俗にデータをこぼすと表現します、送ったデータの一部が欠損してしまうことになります。
これを避けるために、受信側の処理が間に合わない場合は、データ送信を一時止めて、
処理が終わりデータ受信が可能になった時に再びデータを送信す方法が取られます。
このように通信するお互いが相手の状態を確認しながら通信する方法をハンドシェイクと呼びます。
又受信バッファなどのメモリーがオーバーフローしない様に制御する方法をフロー制御と言います。
これに使用されるのが、RTS、CTSですRTSは自分のPCの受信バッファに余裕が有る場合にHightになり、
バッファが溢れそうになるとLowになります。
RTSとCTSはクロス接続されていますので、送信側の機器はCTSの状態を見て受信側の
受信側のバッファが受信不能の場合は受信可能になるまで待機して、
可能な時にだけ送信するいわゆるハードウェア・フロー制御を行なうことが可能になります。
VB.NET又はC#でserialPortクラス又はコントロールを使用する場合は、「RequestToSend」プロパティを
true(True)にします。
この処理は通常はドライバーが行ないます。
当然データは次から次に送られて来ますので、受信バッファが一杯になってから通信を止めたのでは
間に合いません、どのくらいで止めるかはドライバーによりますが、受信バッファの残りが1/3〜1/2に
なると止める場合が多いようです。

ハードウエアを使用しないフロー制御
フロー制御にはRTSとCTSを使わずに、相手にコマンドを送信してバッファがオーバーフローしない様に
コントロールする方法も有ります。
この方法はXon/Xoffと呼ばれ、ソフトウェアーフロー制御とも呼ばれます。
Xon/Xoffは相手にコマンドを送ることによりフロー制御を行ないますので、バイナリデータの送受信には
使用できません。
Xoffは通常^S(Control S )をXonは^Q(Conrol Q)を送ります。
すなわち受信が追いつかないと思ったら^Sを受信が追いついたら^Qを相手に送ります。
Xon/Xoffの処理も通常はドライバが行ないます。
Xon/Xoffフロー制御は何らかの原因で、RTSとCTS線が配線出来ない等の場合に使用しますが、
現実的には殆ど使われておりません。


serialPortのプロパティの設定
VB.NET又はC#でserialPort(SerialPort)コントロールを貼り付けて、プロパティを見ると、以下の様に表示されます。
ただしここでは、serialPortポートコントロールの独自のプロパティだけ表示している。
ここではPCとPCをセリアルポートで接続する例を説明します。
もしこのPCが他の機械のセリアルポートに接続される場合は、設定はそちらの機械に合わせる必要があります。

名称 デフォルト値 説明
BaudRate 9600 シリアル のボー レートを取得または設定します。
DataBits 8 バイトごとのデータ ビットの標準の長さを取得または設定します。
DiscardNull False ポートと受信バッファ間での送信時にnull バイトを無視するかどうかを示す値を取得または設定します。
DtrEnable False シリアル通信中にDTR (Data Terminal Ready) シグナルを有効にする値を取得または設定します。
Handshake None データのシリアル ポート伝送のハンドシェイク プロトコルを取得または設定します。
Parity None パリティ チェック プロトコルを取得または設定します。
ParityReplace 63 パリティ エラーの発生時にデータ ストリーム内の無効なバイトを置き換えるバイトを取得または設定します。
PortName COM1 通信用のポートを取得または設定します。使用可能なすべての COM ポートが含まれますがこのポートには これに限定されるわけではありません。
ReadBufferSize 4096 SerialPort の入力バッファのサイズを取得または設定します。
ReadTimeout -1 読み取り操作が完了していないときにタイムアウトになるまでのミリ秒数を取得または設定します。
ReceivedBytesThreshold 1 DataReceived イベントが発生する前の内部入力バッファのバイト数を取得または設定します。
RtsEnable False シリアル通信中にRTS (Request To Send) シグナルが有効かどうかを示す値を取得または設定します。
StopBits One バイトごとのストップ ビットの標準の数を取得または設定します。
WriteBufferSize 2048 シリアル ポートの出力バッファのサイズを取得または設定します。
WriteTimeout -1 書き込み操作が完了していないときにタイムアウトになるまでのミリ秒数を取得または設定します。

ボーレート(BaudRate)は機種依存
殆どの設定はデフォルトのままでOKですが、一部変更した方が良い場合が有りますので説明します。
BaudRate はPC間の通信の場合は9600ボーより上げる事が可能ですが機種依存となります。
私の1.7GHzのPCでは115200ボーまで通信速度を上げることが出来ました。
なおRS-232Cのケーブル長は15mまでとなっています、ケーブルが長くなる場合はボーレートを下げます。

DTR、DSRを活用しよう
プログラムの中で相手のPCの状態を知りたい場合はDtrEnableはTrueにしておきましょう。
ただしDtrEnableをTrueにしたからと言って何か起こるわけでは有りません。
一方のDtrEnableをTrueにすると、相手側のPCのDSRHoldingがTrueとなりますので、
これを使って相手の状態を確認してデータを送信することが可能となります。
相手機器がDTR、DSRに対応している場合はソフトウェアでこれを積極的に使用する事を推奨します。

データ量が多い場合はフロー制御を行なおう
送受信のデータ量が多い場合はHandshakeをRequestToSendに設定します。
これによりハードウェアのフロー制御が行なわれ、受信バッファが一杯になりデータが
損失される事を防ぎます。
HandshakeをRequestToSendに設定すると、受信バッファに余裕が有る場合はRtsEnableがTrueとなり、
クロス接続されている、相手側のPCのCTSHoldingがTrueとなります。
これを利用して、フロー制御が自動的に行なわれます。

ポート番号の確認
PortNameですがパソコンに専用RS-232CのPortが有って、接続されてPortが一つの場合は殆どの場合Com1です。
ただしUSB-ComPortを使用している場合は、PortNameがCom1とは限りませんので、PCの
「設定」-「コントロール パネル」-「管理ツール」-「コンピューターの管理」-「デバイス マネージャー」-「ポート」-「通信ポート」
で必ず確認してください。
下はPC組み込み済みのRS-232Cのポート(COM1)とUSB to Serril Bridge(COM5)をコントロールパネル(XP)で表示しています。
USB to Serial BridgeがCOM5となっている事に注意して下さい。
画像ファイル
画像ファイル