Xon Xoffのフロー制御をシリアル通信で試してみた

インターフェース

ソフトウェアフロー制御のXon Xoffを試してみました。

実際にシリアル通信でテストして、Xon Xoffのコードまで波形確認しています。

Xon Xoffの使い方からテスト方法まで分かりやすく紹介します。

 

スポンサーリンク

Xon Xoffのフロー制御をシリアル通信で試してみた

シリアル(uart)通信でソフトウェアフロー制御のXon Xoffを試してみました。

「ラズベリーパイ」と「USBシリアル通信ケーブル」で接続しています。

 

ラズパイのシリアル通信先にはPCがあり、Tera Termでフロー制御しています。

わざとTera Term側からXon/Xoffのコードを入力してテストしました。

 

実際にXon Xoffのソフトウェアフロー制御を行うテスト動画も紹介しています。

是非一緒にご覧ください。

ソフトウェアフロー制御をPythonとTera termでテスト

 

ソフトウェアフロー制御

ソフトウェアフロー制御はシリアル通信のデータ線だけで対応可能です。

受信側がバッファが足りなくなった場合など、通信を一時的に止めたい場合に使います。

  • 受信側が通信を止めたい場合…送信側に停止指令の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の信号の波形確認まで行っています。是非一緒にご覧ください。

UARTでRTS/CTSのフロー制御をしてみた

UARTでRTS/CTSのフロー制御をしてみた
UARTのRTS/CTSを使ったハードウェアフロー制御を試してみました。 接続方法・プログラムから実際に測定した波形まで紹介します。 ラズパイとUSBシリアルでテストしていますので、誰でも同様に実施可能です。

 

RS232CのXon Xoffのフロー制御

今回のXon Xoffのフロー制御はUARTで行っていますが、RS232Cでも同じ仕組みです。

ただUARTとRS232Cではハード的な電圧レベルと極性が違いますので注意が必要です。

下記記事で両者の波形含めて確認しています。(リンクはこちら)

USBシリアル通信のボーレートの最大は?通信速度(bps)をオシロで確認

USBシリアル通信のボーレートの最大は?通信速度(bps)をオシロで確認
シリアル通信の速度をオシロスコープで確認してみました。 USBシリアル変換ケーブルのICを調べて、最大のボーレートまで試しています。 シリアル通信のボーレートの設定で通信速度(bps)がどのように変化するか紹介します。

 

PythonでXon Xoffのプログラム

ラズパイとPythonからフロー制御を切り替えれるようにプログラムします。

Pythonで簡単にハードウェア/ソフトウェアのフロー制御をON/OFF可能です。

  • ソフトウェアフロー制御…xonxoff
  • ハードウェアフロー制御…rtscts

 

実際のプログラムは下記です。今回はわざとfor文でシリアル通信をループさせています。

Xon Xoff信号を入れるタイミングを作りたいためです。

プログラム内容としてはUARTのシリアル通信で「Hello World」を10000回出力します。

 

ラズパイから送信して、USBシリアル通信ケーブル経由でPCのTeraTermで受信します。

途中でXon Xoffコードを入れてソフトウェアフロー制御のテストを行います。

 

ラズパイでPythonのプログラムは作成することができます。

初心者の方でも簡単に作れます。下記記事を参考にしてください。(リンク先はこちら)

ラズベリーパイでプログラミング入門!Pythonの簡単な始め方

ラズベリーパイでプログラミング入門!Pythonの簡単な始め方
プログラミングを始めたい方にラズベリーパイを使った簡単な入門方法を紹介します。 プログラミング言語の中でも初心者にもやさしく、人気なPythonがラズパイならば簡単にスタートできます。 ラズベリーパイでプログラミング入門!P...

 

Tera TermでXon Xoffのフロー制御

Tera termでXon Xoffのフロー制御の設定に関してです。

設定→シリアルポートで、フロー制御の箇所を「Xon/Xoff」を選択するだけでOKです。

  • Xon(DC1)を入力したい場合…キーボードから「Ctrl」+ 「q」を入力
  • Xoff(DC3)を入力したい場合…キーボードから「Ctrl」+ 「s」を入力

 

ラズベリーパイでフロー制御のシリアル接続

ラズベリーパイのuartでソフトウェアフロー制御を行えるように設定します。

下記記事でのハードウェアフロー制御も行えるようにUART4(GPIO8-11)で対応しています。

UARTでRTS/CTSのフロー制御をしてみた

  • GPIO8…TxD
  • GPIO9…RxD
  • GPIO10…CTS ※ソフトウェアフロー制御では未使用
  • GPIO11…RTS ※ソフトウェアフロー制御では未使用

 

UART0~5のピンが何処にあるのかは下記コマンドで分かります。

ラズベリーパイ4でのuart0とuart4の結果を貼り付けておきます。

dtoverlay -h uart4

 

ラズパイでUARTを複数使えるように設定

「設定」→「Raspberry Piの設定」からシリアルポートを有効にしておきます。

ただこの状態だとデフォルトのUART0しか使えません。

 

/bootのフォルダにあるconfig.txtを編集します。

筆者はVimで編集していますが、各好きな方法で編集してもらえれば構いません

sudo vim /boot/config.txt

 

下記例のようにUART4をctsrtsのパラメータ含めて追記します。

一番最後の行に記載すればOKです。

※もしハードウェアフロー制御が不要の場合は「,ctsrts」までは必要ありません。

dtoverlay=uart4,ctsrts

 

編集後はラズパイの再起動をお願いします。

下記コマンドを入力するとUART4のデバイスファイルの「ttyAMA1」が確認できます

ls /dev |grep ttyAMA

 

Xon Xoffのアスキーコード(ascii code)

今回Xon Xoffのコードを見るためにオシロスコープで波形測定・デコード(解析)を行います。

オシロスコープの使い方に関しては下記記事でも紹介しています。

オシロスコープの使い方!初めての人向けに多くの測定事例を紹介

 

シリアル通信のTxとRxのみ接続して、プローブを接続しています。

回路イメージとしては下記形です。

 

今回のシリアル通信のICは下記記事で紹介していますがCP2102です。

USBシリアル通信ケーブルをWindows10用に購入してみた

USBシリアル通信ケーブルをWindows10用に購入してみた
特定のUSBシリアル通信ケーブルがWindows10だと使えなくなりました。 実際に使用できないケーブルでの症状、型番・IC含めて紹介します。 またWindows10でも使えるケーブル含めて確認しています。

 

冒頭でも紹介しましたが、実際にXon Xoffを入力するテスト動画も紹介しています。

是非一緒にご覧ください。

ソフトウェアフロー制御をPythonとTera termでテスト

 

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のフロー制御に関して紹介させていただきました。

記事をまとめますと下記になります。

Tera term側からXon/Xoffのコードを入力できます
ラズパイとPythonでソフトウェアフロー制御をテストできます
Xon/Xoff(アスキーコード_DC1/DC3)を入力することで、フロー制御しています

 

別記事でRTS/CTSを使ったハードウェアフロー制御に関しても紹介しています。

是非一緒にご覧ください。(リンクはこちら)

UARTでRTS/CTSのフロー制御をしてみた

UARTでRTS/CTSのフロー制御をしてみた
UARTのRTS/CTSを使ったハードウェアフロー制御を試してみました。 接続方法・プログラムから実際に測定した波形まで紹介します。 ラズパイとUSBシリアルでテストしていますので、誰でも同様に実施可能です。

コメント