12
1.目的 1.目的 1.目的 1.目的 1.目的 データ システムを する 一つ ある。 、データ におけ 、ベースバンド および プロトコル について 学び、データ する。また、 にデータ プログラムを するこ により、 LSI する。 2.解説 2.解説 2.解説 2.解説 2.解説 2.1 概要 2.1 概要 2.1 概要 2.1 概要 2.1 概要 2つ モデル ように る。コンピュータ よう データ データバスを いた並列(パラレル)伝送方式ある。しかしデータを する コスト 題により、 直列(シリアル)伝送方式いる。こ き、データ よう パルス (ディジタル るが、こ よう パルス する ベースバンド伝送 いう。また、 モードがある。1つ ように データ モード 全二重通信 いい、 う一 モー 半二重通信 いう。 データ して 、各 ット データ がある。 ため じタイミング データを りするこ る。こ ようにするこ いい、各 ットご にタイミングを わせるこ ビット同期、データ るために、 データを ット を一つ してタイミングを るこ ブロック同期 いう。 非同期式(調歩同期式) 同期式がある。 にデータ うために 、それぞれ )に って けれ い。こ 通信プロトコル いう。 、データ ようにするか、 データ りを よう うか、 ようにするか ある。 図1 情報機器間で双方向通信を行うときの通信モデル MEMORY I/O Address BUS Data BUS 情報機器 ベースバンド伝送 C P U I/O Data BUS MEMORY 情報機器 C P U Address BUS

デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

1.目的1.目的1.目的1.目的1.目的データ通信は、計算機システムを構築する際の基本技術の一つである。本実験では、データ通信におけ

る直列伝送方式、ベースバンド伝送、半二重通信、全二重通信、同期方式および通信プロトコルなどについて学び、データ通信の基本事項を理解する。また、実際にデータ伝送プログラムを作成することにより、直列伝送用LSIの制御方法等を習得する。

2.解説2.解説2.解説2.解説2.解説2.1 概要2.1 概要2.1 概要2.1 概要2.1 概要

2つの情報機器間で双方向通信を行うときの通信モデルは、図1のようになる。コンピュータのような情報機器内でのデータ伝送はデータバスを用いた並列(パラレル)伝送方式が主である。しかしデータを情報機器の外部に送出する場合は、伝送路コスト等の問題により、主に直列(シリアル)伝送方式を用いる。このとき、データは図示のようなパルス列(ディジタル信号)となるが、このようなパルス列を直接伝送する方式をベースバンド伝送という。また、双方向通信を行う場合2種類の通信モードがある。1つは、図1のようにデータの送受信を同時に行う通信モードで全二重通信といい、もう一方は、送信と受信を交互に行う通信モードで半二重通信という。

データの送受信に際しては、各ビットの区切りの位置やデータの先頭の位置を受信側で知る必要がある。このため送信側と受信側が同じタイミングでデータをやりとりすることが必要となる。このようにすることを同期といい、各ビットごとにタイミングを合わせることをビット同期、データの先頭の位置を知るために、データを示すビット列を一つの単位としてタイミングをとることをブロック同期という。同期のとり方には、非同期式(調歩同期式)と同期式がある。

情報機器間で実際にデータ通信を行うためには、それぞれの機器が同じ規則(規約)に従って通信しなければならない。この規則を通信プロトコルという。例えば、データ信号の電気的仕様をどのようにするか、データのやり取りをどのような順番で行うか、誤り制御はどのようにするかなどの規則である。

デ ー タ 通 信

図1 情報機器間で双方向通信を行うときの通信モデル 

MEMORY

シリアルI/O

Address BUS

Data BUS

情報機器 通 信 路

ベースバンド伝送

C P UシリアルI/O

Data BUS

MEMORY

情報機器

C P U

Address BUS

Page 2: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

2.2 非同期(調歩同期)式直列伝送2.2 非同期(調歩同期)式直列伝送2.2 非同期(調歩同期)式直列伝送2.2 非同期(調歩同期)式直列伝送2.2 非同期(調歩同期)式直列伝送1つの文字データを非同期方式で直列に送出した時のデータ形式を図2に示す。図示のようにデータが

ない時の信号の値はハイレベルまたは論理値'1'の状態にある。各文字データは、スタートビット(論理値'0'で1ビット長)、データビット(5~8ビット長)、パリティビット(1ビット長、なくともよい)、ストップビット(論理値'1'で1,1.5,2ビット長)から構成される。

例えば、データ長8ビット、偶数パリティ、ストップビット長1ビットという条件でAという文字を送出した場合(Aの文字コードは、(41)16=(01000001)2で最下位桁から送出される)回線上では図示のようなパルス列となる。ここで偶数(奇数)パリティチェックとは、データビットとパリティビットの1の個数の和が偶数(奇数)になるようにパリティビットの値を設定して送信し、受信側では、1の個数の和が偶数(奇数)かどうかをチェックしてエラーの有無を判定するものである。

スタートビットとストップビットは文字ごとの区切りをつけさせ、このビットを手がかりにして受信側

スタートビット 検出回路

INシフトレジスタクロック

リセット クロックカウンタ

Q1 Q2 Q3 Q4 ビット・クロックデータからスタート・ビットを検出し、それによってカウンタをリセットする。カウンタQ4をビット・クロックとして使う

データ

16倍クロック

(a) 回 路

16倍クロック

 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15| 0| 1| 

データ (スタート・ビット)

スタート・ビット検出

カウンタ

データ取り込み(シフトレジスタ)

(b)タイムチャート

(1)

(2)

(3)

(4)

(1)

(2)

(3)

(4)

リセット

図3 非同期式の受信側におけるビット・クロックの生成

図2 非同期式直列伝送のデータ形式

LSB

MSB

スタートビットデータビット(5~8ビット) パリティビット

(奇、偶パリティまたは、なし)

ストップビット(1、1.5、2ビット)1ビットタイム

スタートビット

回線アイドルあるいは前のキャラクタのストップビット

ストップビット

A=(41) 16

0 0000 01 1

偶パリ

Page 3: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

がブロック同期(この場合はキャラクタ同期)をとろうとするものである。また、非同期式では、送信側からビット同期情報が送られてこないので、受信側は自分で作り出すことになる。この情報を作り出すためには、受信側は伝送速度よりも十分に速い自分自身の持っているクロックを利用する。クロックの速度が伝送速度の16倍の場合の例を図3に示す。図示のように、スタートビットを検出したら各ビットの中央(8クロック目)をサンプリングしてビット情報を読み込むことができる。このとき、受信側のクロックと送信側のクロックと何の関係もない。送信側は、別の自分のクロックを用いて各ビットを送出している。

2.3 同期式直列伝送2.3 同期式直列伝送2.3 同期式直列伝送2.3 同期式直列伝送2.3 同期式直列伝送送信データを同期方式で回線に送出した時のデータ形式を図4に示す。図においてSYNは同期符号、STX

はテキストの始まりを示すコード、ETXはテキストの終わりを示すコード、CRCはエラーチェックコードである。同期方式では、ビットごとの同期をとるための同期クロックを、データ線の他に同期クロック用の信号線を設けて伝送する方法と、送信側でデータの中に同期クロックを含めて伝送し、受信側で受信情報からこの同期クロックを抽出する方法がある。受信側ではこの同期クロックを基にビット同期をとる。データ線を流れるビット列は、非同期方式のように文字ごとの同期を取るための特定のビットは存在せず、どのビットからデータが始まるかを示す同期符号(SYN符号)をデータブロックの前に付け加えて伝送し、受信側ではこの同期符号を基にブロック同期をとる。さらに、その次から連続してデータが送られてくるものとしてそれ以降送られてきたビット列(例えば8ビット)をまとめたものを文字として認識する。同期式は、非同期式のように、文字ごとにスタートビットやストップビット等を付ける必要がないので、伝送効率が良く高速度のデータ伝送に適している。

μpd8250B

直列伝送用 LSI

レベル変換回路

RS232Cコネクタ

クロック 回路

CPU

DATABUS

ADDRESS BUS

CONTROL BUS

TXD TXDRXD RXD RXDRTS RTS

RTSCTS CTS CTSDTR DTR

DTRRXC RXC

RXCTXC TXCTXC

TXD

図5 直列伝送に使用されるLSIのブロック図

SYN

SYN

STX

第1文字

ETX

CRC

CRC

第n文字

またはETB

第2文字

図4 同期式直列伝送のデータ形式

3.実験装置3.実験装置3.実験装置3.実験装置3.実験装置本実験では、情報機器として、パーソナルコンピュータ(IBM PC/AT互換機)を用いる。この実験装置

を用いて、パソコン内の8ビット並列データを直列データに、あるいは伝送路からの直列データを並列データに変換して送受信する、非同期直列伝送方式の実際を学ぶ。図5にIBM PC/AT互換機の内部で直列伝送に用いられるLSIのブロック図を示す。図示のように、CPU、非同期通信用LSIである8250B、送受信時のスピードを制御するために用意されたクロック回路、TTLとRS-232Cの電圧レベルを変換するレベル変換回路及びRS-232C

Page 4: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

コネクタから構成される。図示の回路においてデータの送受信がどのように行われているかを以下に示す。

<<<<<送信側>送信側>送信側>送信側>送信側>(1)プログラムによって、送信データがCPUのレジスタからDATA BUSを介して8250Bの送信データレジス

タに並列に送られる。(2)8250Bでは並列データを直列データに変換し、TXD端子からレベル変換回路へ送る。(3)レベル変換回路は、表1に示すようにTTLレベルをRS-232Cレベルに変換し、TXD端子からRS-232Cコ

ネクタへ送る。TTLレベルとRS-232Cレベルでは、波形が反転することに注意せよ。(4)RS-232CコネクタのTXD端子からケーブルを介して受信側にデータが送られる。

<受信側><受信側><受信側><受信側><受信側>(1)RS-232CコネクタのRXD端子からデータを受信し、レベル変換回路へ送る。(2)レベル変換回路は、RS-232CレベルをTTLレベルに変換し、RXD端子を介して8250Bへデータを送る。(3)8250Bでは直列データを並列データに変換し、受信データレジスタに入れる。(4)プログラムによって、8250Bの受信データレジスタからCPUへデータを読み込む。

8250BとRS-232Cの主な信号線の呼称及びデータの伝送方向等を表2に示す。8250Bの内部には、ライン・コントロール・レジスタ、モデム・コントロール・レジスタ、ボーレート分周レジスタ、割り込み許可レジスタ、割り込み参照レジスタ、ライン・ステータス・レジスタ、モデム・ステータス・レジスタ、スクラッチパッド・レジスタ、受信データ・レジスタ。送信データ・レジスタを持つ。ライン・ステータス・レジスタは、パリティの設定、データ長の設定、ストップビットの設定を行う。モデムコントロールレジスタは、RS-232CのDTR(端末送受信可・不可),RTS(送信要求)の出力信号線の制御を行う。ライン・ステータス・レジスタは、エラーの有無や受信データの有無、送信データレジスタの空き状態などのステータスを記憶しているレジスタである。また、送受信データレジスタは、送受信データを一時格納するレジスタである。

4.通信プログラムの作成4.通信プログラムの作成4.通信プログラムの作成4.通信プログラムの作成4.通信プログラムの作成通信プログラムが通信の最初に行うことは、伝送スピードやデータビットの長さ等といった伝送条件を

設定することである。伝送条件の設定は8250Bに対して行われ、その初期設定のフローチャートを図6に示す。まず、8250Bのリセットを行う。次に、ボーレートの設定を行い、ライン・コントロール・レジスタの各項目(伝送条件に相当する)、モデム・コントロール・レジスタを設定する。ライン・コントロール・レジスタを図7に、モデム・コントロール・レジスタのを図8に示す。

ライン・コントロール・レジスタの設定の例を以下に示す。例えば、伝送条件が、キャラクタ長が7ビット長、偶数パ リティ、1ストップビットの場合は、

01011000

というビット列になりこれを16進数で表わすと0x1aとなる。この0x1aという値をライン・コントロール・レジスタに書き込むことにより与えられた条件での送受信が可能となる。これをC言語で書くと、

outp(port+LCR, 0x1a);となる。ここでportとは使用するチャンネルのポートアドレス(8250Bの先頭アドレス)であり、LCRはライ

RS-232C(V)

-5~-15 (-10)

+5~+15 (+10)

2.4 ~ 5

0 ~ 0.4

TTL(V)

1

0

論理

表2 μpd8250BとRS-232Cの主な信号線の呼称表1 TTLレベルとRS-232Cレベル

─→

←→←→

DTRGNDCTSRTSRXDTXD

DTR-CTSRTSRXDTXD

458723

データ・端末・レディグランド送信可送信要求受信データ送信データ 

パソコン 外部機器信号方向

ピンNORS-232C8250B名 称

Page 5: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

ン・コントロール・レジスタのオフセット値である。これらの値は、表3と表4の通りである。次に、モデム・コントロール・レジスタの設定を示す。DTR(端末送受信可),RTS(送信要求)ともにオンの

場合は、

11000000

というビット列になり、これを16進数で表わすと0x03となる。この0x03という値をモデム・コントロール・レジスタに書き込むことにより与えられた条件での送受信が可能となる。これをC言語で書くと、

outp(port+MCR, 0x03);となる。

CPUは8250Bの状態をデータバスを介して読み込むことができる。これがライン・ステータス情報で、その内容を図9に示す。ライン・ステータス情報を読み込むには、ライン・ステータス・レジスタのポート番号を指定してレジスタの内容を読み込めばよい。C言語で書くと、

d = inp(port+LSR);

図7 ラインコントロールレジスタ

図6 8250Bの初期設定フローチャート図8 モデムコントロールレジスタ

ライン・コントロール・レジスタ設定

完了

終了

yesno

開始

モデム・コントロール・レジスタ設定

ボーレート分周レジスタ設定

データ転送

リセット

01234567

DLABビット

データ・ビット長 1 1 : 8ビット 1 0 : 7ビット 0 1 : 6ビット 0 0 : 5ビット

ブレーク・コントロール・ビット

ストップ・ビット長 1 2ビット(6,7.8ビット長)  1.5 ビット(5ビット長) 0 1ビット

パリティ 1 1 1 : 0固定 1 0 1 : 1固定 0 1 1 : 偶数 0 0 1 : 奇数 x x 0 : 無し

01234567

自己診断モード

0 0 OUT1OUT2

RTSDTR

○各ビットとも1で対応する出力端子がアクティブとなる。○割り込み使用時にはOUT2をセットする。

表4 8250Bレジスタオフセット値

6モデム・ステータス・レジスタ

5ライン・ステータス・レジスタ

4モデム・コントロール・レジスタ

3ライン・コントロール・レジスタ

1ボーレート分周レジスタMSB

0ボーレート分周レジスタLSB

0受信データレジスタ送信データレジスタ

オフセット値レジスタ名表3 8250Bポートアドレス

2F8hチャンネル1(com1)

3F8hチャンネル0(com0)

ポートアドレスチャンネル名

Page 6: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

となる。この場合変数dにステータス情報が格納される。次に実際にデータの送受信を行う場合を考える。データを送信する手順は、ステータスレジスタで送信

レディであることを確認し、送信レディーであれば送信データを1バイトずつ送信データレジスタに書き込む。また、データを受信する手順は、ステータスレジスタで受信データがあるかどうか確認し、受信データがある場合は、受信データレジスタからデータを1バイトずつ読み込む。

データ送信の例として文字'A'を送信する場合を考える。データを送信する場合は、ステータスレジスタのD5ビット(送信レディ)が1であることを確認してからデータを送らなければならない。C言語で書くと、

while((inp(port+LSR)&0x01) != 0x01);outp(port+TDB, 'A') ;

または、while(!(inp(port+LSR)&0x01));outp(port+TDB, 'A');

となる。次にデータの受信の例として、受信した文字を変数cに格納することを考える。データを受信するとき

は、ステータスレジスタのD0ビット(受信データ有)が1であることを確認しその後受信データレジスタからデータを読み込む。C言語で書くと、

while((inp(port+LSR)&0x01) != 0x01);c = inp(port+DRR);

または、while(!(inp(port+LSR) & 0x01));c = inp(port+RDB);

となる。これまでみてきたた初期化の手続きをinit_8250B()として用意した。RS232Cの通信で使用する定義と関数

をそれぞれ、rs232c.hとrs232c.cにまとめた。それらを用いた、送信プログラムと受信プログラム、分割コンパイルのためのmakefileとともに、テキストの最後に図11~15として添付したので、参照すること。

5. 実験操作5. 実験操作5. 実験操作5. 実験操作5. 実験操作5.1  非同期式直列伝送の波形予測5.1  非同期式直列伝送の波形予測5.1  非同期式直列伝送の波形予測5.1  非同期式直列伝送の波形予測5.1  非同期式直列伝送の波形予測非同期式直列伝送で次のような条件で送信した場合に得られる波形を予測せよ。(解説2.2を参照)

(a)伝送条件:7ビット長データ+1ストップビット+偶数パリティ+9600bps、伝送文字:A(b)伝送条件:7ビット長データ+1ストップビット+偶数パリティ+9600bps、伝送文字:C(c)伝送条件:8ビット長データ+2ストップビット+パリティ無し+9600bps、伝送文字:C

5.2 非同期(調歩同期)式直列伝送実験5.2 非同期(調歩同期)式直列伝送実験5.2 非同期(調歩同期)式直列伝送実験5.2 非同期(調歩同期)式直列伝送実験5.2 非同期(調歩同期)式直列伝送実験ここでは、非同期式直列伝送の実験を行う。オシロスコープを用いて、RS-232Cコネクタから出力される

図10 モデムステータスレジスタ図9 ラインステータスレジスタ

01234567

受信データあり受信バッファ・オーバーランパリティ・エラーフレーミング・エラーブレーク信号検出送信ホーディング・レジスタ空送信シフト・レジスタ空

○ビット0は、受信データ・リードによりセット○ビット1~4は、ライン・ステータス・レジスタ・リードによりセット○ビット5は、送信データによりセット○送信バッファはダブルバッファ構成であり、 ビット5はバッファが1つ以上空で送信データを書き込み可能な事を示し、 ビット6は、ダブルバッファがともに空である事を示す。

01234567

CTS(Clear To Send)

過渡状態のCD/CI/DST/CTS信号

DSR(Data Set Ready)CI(Call Indicator)CD(Carrier Detect)

Page 7: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

波形を観測する。(1)(テキストの最後に添付した)プログラムprog1.cは、非同期式直列伝送で文字Aを連続的に送出するプ

ログラムで、プログラムprog2.cは、送られてきた文字を受信しそれをディスプレーに表示するプログラムである。2つのプログラムの伝送条件は、7ビット長+1ストップビット+偶数パリティで、スピードは9600bpsである。この2つのプログラムをコンパイルし実行せよ。このとき、RS232CのTXD端子(2番ピン)の出力波形をオシロスコープに表示し、スタートビットからストップビットまでの波形をグラフ用紙にスケッチせよ。

(2)伝送文字をCに変えて同様の実験を行え。(3)伝送条件を8ビット+2ストップビット+パリティ無しになるようにプログラムを改め、文字Cを送出し

波形をスケッチせよ。伝送条件を変えるには、ライン・コントロール・レジスタの内容を変更してやればよい。詳細は解説4.通信プログラムの作成を参照せよ。

(4)実験(3)と同じ条件で伝送スピードを2400bpsになるようにプログラムを改め、文字Aを送出し波形をスケッチせよ。伝送スピードはボーレート分周レジスタの設定値を変更する必要があるが、init_8250B()で、ボーレートの値を直接指定すればよい。

(5)受信プログラムprog2.cを改良し、パリティエラーを検出し、パリティエラーを検出したらディスプレイにパリティエラーと表示するルーチンを追加せよ。パリティエラーが発生するとステータスレジスタのパリティエラービットが1になる。(図9参照)動作チェックのためにパリティエラーを起こさせるには、送信側を奇数パリティ、受信側を偶数パリティに設定し、パリティーがあわないようにすればよい。なお、プログラムの動作テストには、(1)同じ伝送条件の時、エラーが起こらない、(2)パリティーの設定が合わない時、パリティーエラーが起こることを確認すること。

詳細な手順詳細な手順詳細な手順詳細な手順詳細な手順 上記(2)の実験のを例にとり、詳しい手順を以下に示す。(i)まず、パソコン後部のRS-232Cコネクタに伝送ケーブルを接続した状態で、一方のパソコンで送信プログ

ラムをもう一方のパソコンで受信プログラムを実行し(受信プログラムを先に実行する)、実際に文字Aが連続的に送られていることを確認する。

(ii)その後CTRL+Cキーを押してプログラムを停止し、伝送ケーブルをRS-232Cコネクタからはずし、代わりにRS-232Cワイヤリングアダプタを接続する。なお、ワイヤリングアダプタには、波形を観察するための結線しか無いため、RS-232Cコネクタとケーブルの間にワイヤリングアダプタをはさむと、信号が相手に伝わらないので注意すること。

(iii)次にそれぞれのパソコンでオシロスコープのプローブをワイヤリングアダプタの送信線(オレンジ色)とグランド線(グレー色)に接続し、送信プログラムを実行してオシロスコープに表示される波形をスケッチする。

(iv)波形をスケッチする。スタート、データ、パリティー、ストップビットを記入すること。軸の説明と単位を付け、軸には目盛りと数値を入れること。

5.3 簡易ターミナルプログラム5.3 簡易ターミナルプログラム5.3 簡易ターミナルプログラム5.3 簡易ターミナルプログラム5.3 簡易ターミナルプログラム(1)プログラムprog1.cとプログラムprog2.cを参考にし、簡易ターミナルプログラムを作成する。2台のパソ

コンで、同じ簡易ターミナルプログラムを動かして、お互いに、入力した文字が表示されるのを確認する。

(2)実験(1)のプログラムに、フロー制御を追加しなさい。

フロー制御フロー制御フロー制御フロー制御フロー制御フロー制御とは、受信側で処理に時間がかかるような時に、伝送データの流れを一時停止したり再開し

たりしてデータの流れを制御することによりデータの読み飛ばしなどを防ぐものである。ここでは以下に示すような手順でフロー制御を行う。(1)受信側では受けとったデータをフロッピーディスクに書き込まずにバッファ(配列)に格納する。(2)受信データがバッファの容量をオーバーする前に送信側にctrl_sコード(0x13)を送る。(3)送信側でctrl_sコード(0x13)を受信したらデータを送るのを一時停止する。(4)送信側でデータを送るのを一時停止している間に受信側は、バッファに溜まった受信データをフロッ

Page 8: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

ピーディスクに書き込む。(5)受信側でバッファ内のデータを全てフロッピーディスクに書き込んだら送信側にctrl_qコード(0x11)を送

る。(6)送信側でctrl_qコード(0x11)を受けとったらファイル伝送を再開する。ファイル内の全てのデータを送り終わるまで、(1)~(6)を繰り返す。

6. 報告書6. 報告書6. 報告書6. 報告書6. 報告書6.1 報告書に含まれるべき内容6.1 報告書に含まれるべき内容6.1 報告書に含まれるべき内容6.1 報告書に含まれるべき内容6.1 報告書に含まれるべき内容

 報告書には以下の内容が必ず含まれていなければならない。(1)目的(2)実験手順(3)実験結果

(i)非同期式直列伝送の実験でスケッチした、波形図全てをグラフ用紙に書く。スタートビット、データビット、パリティビット、ストップビットの位置を明記する。図には、図の番号とタイトルを、必ず図の下に明記する。

(ii)実験で作成したプログラムリストの全て(改良した部分だけでよい)。(4)実験結果に関する考察(次項参照)

6.2 考察すべき事柄6.2 考察すべき事柄6.2 考察すべき事柄6.2 考察すべき事柄6.2 考察すべき事柄(1)非同期式直列伝送の実験5.1の(1)と(4)でスケッチした波形から伝送速度を算出し、プログラムの中

で設定した伝送速度と比較し考察せよ。(2)非同期式直列伝送で、JISコードAを、データビット長6ビット、偶数パリティ、ストップビット長1ビッ

ト、9600bpsで送出した時、どのような波形になるかグラフ用紙に書き問題点を考察せよ。(3)非同期式直列伝送の実験5.2の(5)で作成したプログラムに、フレーミングエラー及びオーバーランエ

ラーの検出ルーチンを追加せよ(追加部分だけでよい)。何のエラーが起こったのか分かるようにすること。ここでフレーミングエラーとは、ストップビットの位置で"0"が検出された場合のエラーであり、オーバーランエラーとは、受信データを8250Bから読み取る前に、次の文字(データ)を受信してしまった場合のエラーである。(図9参照)

(4)非同期式直列伝送と同期式直列伝送で、ブロック同期及びビット同期はそれぞれどのように行なっているのか表を用いて簡潔にまとめよ。

(5)現在インターネットで実用化されている通信プロトコルを1つ選び、その通信プロトコルについて説明せよ。

(6)上の項目以外の事柄に関する考察も、気が付いた範囲でできるだけ書くようにする。

参考文献参考文献参考文献参考文献参考文献1)宮崎誠一著,「マイクロコンピュータ・データ伝送の基礎と実際」, CQ出版, 1985.2)電気通信協会編,「データ伝送の基礎知識」, オーム社, 1984.3)福永邦雄著,「コンピュータ通信とネットワーク」, 共立出版, 1987.4)トランジスタ技術SPECIAL,「特集:データ通信技術のすべて」, CQ出版, 1988.5)C&C++プログラマのためのI/O制御プログラミング入門, CQ出版社, 1996.

Page 9: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <conio.h>#include <dos.h>

#define COM00x3f8 /* COM0 ベースアドレス */

#define RDB 0 /* 受信データ・レジスタ */#define TDB 0 /* 送信データ・レジスタ */#define IER 1 /* 割込許可レジスタ */#define IIR 2 /* 割込参照レジスタ */#define LCR 3 /* ライン・コントロール・レジスタ */#define MCR 4 /* モデム・コントロール・レジスタ */#define LSR 5 /* ライン・ステータス・レジスタ */#define MSR 6 /* モデム・ステータス・レジスタ */#define SCR 7 /* スクラッチパッド・レジスタ */#define DLL 0 /* ボーレート分周レジスタLSB */#define DLM 1 /* ボーレート分周レジスタMSB */

#define RxRDY 0x01 /* ライン・ステータス・レジスタ : 受信レディー */#define TxRDY 0x20 /* ライン・ステータス・レジスタ : 送信レディー */#define DTR 0x01 /* モデム・コントロール・レジスタ : 端末送受信可 */#define RTS 0x02 /* モデム・コントロール・レジスタ : 送信要求 */#define MCRDAT ( RTS ¦ DTR ) /* モデム・コントロール・レジスタ初期設定 */#define ERR (-1) /* エラー時のリターン・コード */#define NOERR 0 /* エラー無のリターン・コード */

void outp( unsigned addr, int data );int inp( unsigned addr );int init_8250b( unsigned port, int mode, unsigned long lbps );

図11 rs232c.h

Page 10: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

#include "rs232c.h"

/* I/O アクセス関数 */void outp(unsigned addr, int data){_EDX = addr;_AL = data;__emit__(0xEE);// out dx, al}

int inp(unsigned addr){_EDX = addr;__emit__(0xEC);// in al, dxreturn _AL;}

/* 8250B の初期化 */int init_8250b(unsigned port, /* 8250B ベースアドレス */int mode, /* ライン・コントロール・レジスタ設定値 */unsigned long lbps /* ボーレート */){outp( port + MCR, 0 ); /* RS-232C 割込禁止 */outp( port + LCR, 0 ); /* ライン・コントロール・レジスタ : DLAB = 0 */outp( port + IER, 0 ); /* 割込許可レジスタ : 全割込マスク */

/* ボーレート設定 */lbps = 115200L / lbps;

outp( port + LCR, inp( port + LCR ) ¦ 0x80 );/* ライン・コントロール・レジスタ : DLAB = 1 */

outp( port + DLM, ( unsigned )lbps >> 8 );/* ボーレート分周レジスタ MSB */

outp( port + DLL, ( unsigned )lbps );/* ボーレート分周レジスタ LSB */

outp( port + LCR, inp( port + LCR ) & 0x7f );/* ライン・コントロール・レジスタ : DLAB = 0 */

/* end ボーレート設定 */

outp( port + LCR, mode ); /* ライン・コントロール・レジスタ 初期設定 */outp( port + MCR, MCRDAT ); /* モデム・コントロール・レジスタ 初期設定 */

return( NOERR );}

図12 rs232c.c

Page 11: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

#include "rs232c.h"

/*************************** * main 送信処理 ***************************/void main( ){unsigned port = COM0; /* 8250B ベースアドレス : COM0 */int mode = 0x1a; /* モード命令 : 1ストップ,偶数パリティ,7ビット */unsigned long lbps = 9600L; /* ボーレート : 9600 bps */

init_8250b(port, mode, lbps);

while (1) {do { kbhit(); }while (! (inp( port + LSR ) & TxRDY )); /* 送信レディーか? */

outp( port + TDB, 'A'); /* 文字 A を送信 */}}

図13 prog1.c

図14 prog2.c

#include "rs232c.h"

/*************************** * main 受信処理 ***************************/void main( ){unsigned port = COM0; /* 8250B ベースアドレス : COM0 */int mode = 0x1a; /* モード命令 : 1ストップ,偶数パリティ,7ビット */unsigned long lbps = 9600L; /* ボーレート : 9600 bps */int c;

init_8250b(port, mode, lbps);

while (1) {do { kbhit(); }while (! (inp( port + LSR ) & RxRDY )); /* 受信文字があるか? */

c = inp( port + RDB); /* 受信文字を取り出し */printf("%c", c); /* 受信文字を表示 */

}}

Page 12: デ ー タ 通 信ea3pch.yz.yamagata-u.ac.jp/member/sumio/GakuseiJikken/5...CTS CTS CTS DTR DTR DTR RXC RXC RXC TXC TXC TXC TXD 図5 直列伝送に使用されるLSIのブロック図

図15 makefile

#==========================================================================## makefile - makefile for prog1,2##==========================================================================## (c) Copyright 2002.04.22 TAKETA Toshihiro# ALL RIGHTS RESERVED#

ex1: prog1.exe prog2.exe

ex2: prog3.exe

ex3: prog4.exe

all: prog1.exe prog2.exe prog3.exe prog4.exe

prog1.exe: prog1.obj rs232c.obj $(CC) $(CFLAGS) prog1.obj rs232c.obj

prog2.exe: prog2.obj rs232c.obj $(CC) $(CFLAGS) prog2.obj rs232c.obj

prog3.exe: prog3.obj rs232c.obj $(CC) $(CFLAGS) prog3.obj rs232c.obj

prog4.exe: prog4.obj rs232c.obj $(CC) $(CFLAGS) prog4.obj rs232c.obj

clean: -@if exist *.obj del *.obj >nul -@if exist *.exe del *.exe >nul -@if exist *.tds del *.tds >nul -@if exist *.bak del *.bak >nul