ソフトウェアフロー制御のXon Xoffを試してみました。
実際にシリアル通信でテストして、Xon Xoffのコードまで波形確認しています。
Xon Xoffの使い方からテスト方法まで分かりやすく紹介します。
Xon Xoffのフロー制御をシリアル通信で試してみた
シリアル(uart)通信でソフトウェアフロー制御のXon Xoffを試してみました。
「ラズベリーパイ」と「USBシリアル通信ケーブル」で接続しています。
ラズパイのシリアル通信先にはPCがあり、Tera Termでフロー制御しています。
わざとTera Term側からXon/Xoffのコードを入力してテストしました。
実際にXon Xoffのソフトウェアフロー制御を行うテスト動画も紹介しています。
是非一緒にご覧ください。
ソフトウェアフロー制御
ソフトウェアフロー制御はシリアル通信のデータ線だけで対応可能です。
受信側がバッファが足りなくなった場合など、通信を一時的に止めたい場合に使います。
- 受信側が通信を止めたい場合…送信側に停止指令のXoff(DC3)を送ります。
- 受信側が通信を再開したい場合…送信側に再開指令のXon(DC1)を送ります。
実際にはRxのデータ線を使ってXoffコードを送り、通信を停止させます。
Xoffコードはアスキーコード(ASCII CODE)だと「DC3」となります。
Xonコードも同様です。Rxのデータ線を使って通信を再開させます。
Xonコードはアスキーコード(ASCII CODE)だと「DC1」となります。
特に通信を止める必要が無い場合は、通常のシリアル通信が行われます。
ハードウェアフロー制御
ハードウェアフロー制御はRTS/CTSの制御信号を使用します。
- RTS…Request to Send(送信要求)
- CTS…Clear to Send(送信可)
ハードウェアフロー制御では相手先のCTS(送信可)信号が来ていた場合に通信可能です。
ハードウェアフロー制御に関しては別記事でまとめています。(リンクはこちら)
実際にRTS/CTSの信号の波形確認まで行っています。是非一緒にご覧ください。
RS232CのXon Xoffのフロー制御
今回のXon Xoffのフロー制御はUARTで行っていますが、RS232Cでも同じ仕組みです。
ただUARTとRS232Cではハード的な電圧レベルと極性が違いますので注意が必要です。
下記記事で両者の波形含めて確認しています。(リンクはこちら)
USBシリアル通信のボーレートの最大は?通信速度(bps)をオシロで確認
PythonでXon Xoffのプログラム
ラズパイとPythonからフロー制御を切り替えれるようにプログラムします。
Pythonで簡単にハードウェア/ソフトウェアのフロー制御をON/OFF可能です。
- ソフトウェアフロー制御…xonxoff
- ハードウェアフロー制御…rtscts
実際のプログラムは下記です。今回はわざとfor文でシリアル通信をループさせています。
Xon Xoff信号を入れるタイミングを作りたいためです。
プログラム内容としてはUARTのシリアル通信で「Hello World」を10000回出力します。
1 2 3 4 5 |
import serial ser = serial.Serial('/dev/ttyAMA1', 115200, xonxoff=True, rtscts=False) for i in range(10000): ser.write(b'Hello World') ser.close() |
ラズパイから送信して、USBシリアル通信ケーブル経由でPCのTeraTermで受信します。
途中でXon Xoffコードを入れてソフトウェアフロー制御のテストを行います。
ラズパイでPythonのプログラムは作成することができます。
初心者の方でも簡単に作れます。下記記事を参考にしてください。(リンク先はこちら)
ラズベリーパイでプログラミング入門!Pythonの簡単な始め方
Tera TermでXon Xoffのフロー制御
Tera termでXon Xoffのフロー制御の設定に関してです。
設定→シリアルポートで、フロー制御の箇所を「Xon/Xoff」を選択するだけでOKです。
- Xon(DC1)を入力したい場合…キーボードから「Ctrl」+ 「q」を入力
- Xoff(DC3)を入力したい場合…キーボードから「Ctrl」+ 「s」を入力
ラズベリーパイでフロー制御のシリアル接続
ラズベリーパイのuartでソフトウェアフロー制御を行えるように設定します。
下記記事でのハードウェアフロー制御も行えるようにUART4(GPIO8-11)で対応しています。
- GPIO8…TxD
- GPIO9…RxD
- GPIO10…CTS ※ソフトウェアフロー制御では未使用
- GPIO11…RTS ※ソフトウェアフロー制御では未使用
UART0~5のピンが何処にあるのかは下記コマンドで分かります。
ラズベリーパイ4でのuart0とuart4の結果を貼り付けておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
pi@raspberrypi:~ $ dtoverlay -h uart0 Name: uart0 Info: Change the pin usage of uart0 Usage: dtoverlay=uart0,<param>=<val> Params: txd0_pin GPIO pin for TXD0 (14, 32 or 36 - default 14) rxd0_pin GPIO pin for RXD0 (15, 33 or 37 - default 15) pin_func Alternative pin function - 4(Alt0) for 14&15, 7(Alt3) for 32&33, 6(Alt2) for 36&37 |
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~ $ dtoverlay -h uart4 Name: uart4 Info: Enable uart 4 on GPIOs 8-11. BCM2711 only. Usage: dtoverlay=uart4,<param> Params: ctsrts Enable CTS/RTS on GPIOs 10-11 (default off) |
ラズパイでUARTを複数使えるように設定
「設定」→「Raspberry Piの設定」からシリアルポートを有効にしておきます。
ただこの状態だとデフォルトのUART0しか使えません。
/bootのフォルダにあるconfig.txtを編集します。
筆者はVimで編集していますが、各好きな方法で編集してもらえれば構いません
下記例のようにUART4をctsrtsのパラメータ含めて追記します。
一番最後の行に記載すればOKです。
※もしハードウェアフロー制御が不要の場合は「,ctsrts」までは必要ありません。
編集後はラズパイの再起動をお願いします。
下記コマンドを入力するとUART4のデバイスファイルの「ttyAMA1」が確認できます
Xon Xoffのアスキーコード(ascii code)
今回Xon Xoffのコードを見るためにオシロスコープで波形測定・デコード(解析)を行います。
オシロスコープの使い方に関しては下記記事でも紹介しています。
オシロスコープの使い方!初めての人向けに多くの測定事例を紹介
シリアル通信のTxとRxのみ接続して、プローブを接続しています。
回路イメージとしては下記形です。
今回のシリアル通信のICは下記記事で紹介していますがCP2102です。
USBシリアル通信ケーブルをWindows10用に購入してみた
冒頭でも紹介しましたが、実際にXon Xoffを入力するテスト動画も紹介しています。
是非一緒にご覧ください。
Xon/Xoffのシリアル通信テスト
テストした一連の流れを紹介します。ラズパイ(左側)のPythonのプログラムは開いています。
最初にPC(右側)のTera termで、ボーレートとフロー制御の設定を行います。
Pythonのプログラムを実行して、10000回Hello Worldをシリアル通信させます。
Tera term側で大量のHello Worldを確認したら、Xoffコードをわざと入力します。
キーボードで「Ctrl」+ 「s」を打ちます。入力後はシリアル通信が停止します。
オシロスコープでXoffの波形を確認します。
デコード(解析)結果からXoffがアスキーコードの「DC3」であることが分かります。
Tera term側からXonコードを入力します。
キーボードで「Ctrl」+ 「q」を打ちます。入力後はシリアル通信が再開します。
オシロスコープでXonの波形を確認します。
デコード(解析)結果からXoffがアスキーコードの「DC1」であることが分かります。
Xon(DC1)のコード
取得したXon(DC1)のコードの波形を残しておきます。
オシロスコープのデコード機能でDC1が確認できています。
Xoff(DC3)のコード
取得したXoff(DC3)のコードの波形を残しておきます。
オシロスコープのデコード機能でDC3が確認できています。
まとめ
今回はシリアル通信のXon/Xoffのフロー制御に関して紹介させていただきました。
記事をまとめますと下記になります。
別記事でRTS/CTSを使ったハードウェアフロー制御に関しても紹介しています。
是非一緒にご覧ください。(リンクはこちら)
コメント