今回は筆者が持っているラズベリーパイとRS232Cを接続して「RS232CとUARTの違いをアナライザで確認してみた」を紹介します
RS232CとUART通信の差を比較するまでの手順を紹介しています。「自分でRS232Cを色々解析してみたい!」という方におススメな記事となっています
過去記事の「UART通信のシリアル波形をアナライザで解析してみた」でUARTでも同様に解析しました。UARTのことも調べたいという方は下記記事をご覧ください
RS232CとUARTの違い
RS232CとUARTの違いに関しては既にネットの先人たちが多くの記事を書いてくださっているので大分省略しますが、大きな違いとして2点あります。
出力電圧レベル
①出力電圧レベルが異なる
RS232C ・・・出力電圧がH_+5V~+15V、L_-5V~-15V
UART ・・・出力電圧がH_2.8V~3.3V、L_0V~0.5V
※RS232C・UARTともにIC次第で電圧レベルが差がありますので詳細は使用するICのデータシートをご確認ください。上記はあくまで1例です。
実際にオシロでRS232C・UARTの電圧レベルを確認した記事が下記になります。
よろしければご覧ください。(リンク先はこちら)
信号論理
②信号論理が逆
RS232C ・・・アクティブHi
UART ・・・アクティブLow
この違いを踏まえて記事を紹介していきます
ラズベリーパイとRS232C接続をしてみる
まずはRS232C通信環境をラズベリーパイを使って作っていきます。
今回の環境構成
ラズベリーパイとPCをRS232C接続はUARTと違いひと手間あります。電圧レベル・信号論理が異なるためインバータ(バッファ)を噛ます必要があります
実際につなげた写真がこちらとなります。
「ラズベリーパイ」と「USB-RS232C変換モジュール」と「インバータ(バッファ)」とPCを接続しています。
インバータ(バッファ)はDIP形状のためブレッドボード上で接続をしています。
使用したICは「TC74HC4049AP」で汎用ICです。電子部品パーツ店行けばどこにでも置いてあるようなインバータ(バッファ)です。
このICで電圧レベル・信号論理を変換します
USB-RS232C変換モジュールも一般的なものです。最近はAmazon経由で中国製品が安く買えるので助かっています。
コネクタになっているので、ピンに直接ジャンパー接続してあげましょう
筆者のは少し型が古いラズベリーパイですが、UART(RS232C)をつなぐのは新旧ともに簡単にできます。
USB-RS232C変換モジュールは下記製品を使っています。非常に安くても機能的に問題無しです
TC74HC4049APも調べたらAmazonで一応売っていましたが、すごく高かったので安い電子パーツ店での購入をおススメします(20180817時点)
回路図(概要)
概要の回路図的には下記の形になります。インバータバッファを噛まして「3,3V」「GND」「TX」「RX」繋げるだけです。
点線箇所のUSB-RS232C変換IC(PC)は必要箇所だけ切り取った概要のブロック図となっています。
筆者のイメージで記載しているので省略・実際の回路と違うことがあることはご了承ください。(20180817時点での参考データシートはこちらから)
※1_ラズベリーパイのGPIOピン配置は新しい型に合わせています
※2_GND配線が見やすさ優先したため実配線箇所と異なっています
※3_TXD,RXD配線名はPC側視点で書いています
ソフト(Tereterm)
そしてPCからコンソール接続するソフト「Tereterm」を起動していきます
※Teretermの詳細に関してはググってもらえればすぐダウンロードサイトが出てきますので省略します。ダウンロードすればすぐに使えます
動作手順
下記がTeretermを動かした際の手順です。
①USB-RS232C変換モジュールをPCのUSBポートに挿す。ドライバが自動的にインストールされます
※今回のドライバはCH340というものでした
②最初の選択でシリアルを選択してUSB-RS232C変換のポートを選択します
③設定⇒ボーレートで115200を選択します。
※ボーレートというのは通信速度のことでラズベリーパイのデフォルト設定は115200となっていると思います。
④「Enter」を押してみましょう。ログイン画面が出てきます(もし電源投入時は初期のカーネルログが出てくると思います。)これで無事RS232C経由でUART通信ができました。
アナライザを使ってRS232Cの波形を次章から紹介してきたいと思います
アナライザを用意する
今回はRS232Cの「TX」「RX」を見ますのでアナライザを使って確認していきます。
最近はI2CやSPIなど数MHz,数十MHz程度の解析するアナライザが1000円足らずで買えます。筆者は色々触りたかったのでモジュール化されていないアナライザの開発ボードを買いました。
(※値段は一番安く多くのピンで遊べますが、EEPROMなどの設定が必要ですのでマイコン初心者は少し難しいかもしれません)
本当にマイコン(サイプレス製CY7C68013A)が載っているだけのボードです。PCとUSB経由で接続して解析することができます。詳細は下記になります
MiniUSBケーブルとジャンパーワイヤは別で購入が必要です
但し数百円の差ですので下記のようなモジュールになっているアナライザを買った方が直ぐに測定できて楽できるかと思います。
PCとUSB接続してI2C,UART,SPIなど多くの通信を解析できます。USBケーブル、ジャンパーワイヤまで付いてきますので単に解析するだけならば筆者的には下記をおススメします
アナライザを使ってRS232Cの波形を確認する
アナライザにも配線する必要がありますので下記のようにブレッドボードで中継していきます
アナライザを使ってラズベリーパイ側の「TX」「RX」の箇所に接続します。
最初に説明したようにRS232Cだと電圧レベルがUARTと違いアナライザ側の定格超える恐れがあるためです。
そしてEnter押してラズベリーパイのログイン画面を表示した波形を確認します。
今回のRS232C-uartの通信内容
実際に回路図ベースでイメージすると下記のような内容になります
①USB-RS232C変換モジュール(PC)側から「Enter」のキー入力がラズベリーパイ側に送信されます
②ラズベリーパイ側からログイン画面の表示がUSB-RS232C変換モジュールに送信されます
波形をアナライザで解析する
そして実際にとれた波形の一部が下記です。無事「TX」「RX」の波形を取れました。(この波形では①②の全体波形を示しています)
※TX,RXは上記回路図の信号シンボル通りUSB-RS232C変換モジュール側の視点です
これだけだと何のデータか分からないので前回同様解析の設定でUARTを選択します。正しい波形が取れていれば勝手に解析をしてくれます
これで、無事アナライザでUARTの解析ができました。下記のように各bit、[Start bit][Stop bit]のデータが視覚的に分かるようになります。
今回はRS232CとUARTの信号論理が本当に逆になっているかを次の章から確認してみます
RS232CとUARTの信号論理の違いを見てみる
信号論理をアナライザで測定したいのですが、前章で記述したように電圧レベルが異なりRS232Cを直接アナライザで測定できません。
※マイナス電圧域を測定できるオシロがあれば測定可能ですが、筆者含めてプライベートでオシロを持っている方は非常に少ないと思いますので今回は別案でいきます
従来の「インバータバッファ」を「バッファ」に改造してラズベリーパイ側でRS232Cの信号論理をそのままで測定します
ブレッドボード上の使うICを変更します。型番一つ違いのICです。これも電子パーツ店で安く入手できます。同じDIPの形状ですので置き換えるだけで改造も簡単です。
従来_インバータバッファ TC74HC4049AP
改造_ バッファ TC74HC4050AP
では実際に従来(UART)と改造(RS-232C)の波形を並べてみました。
枠で囲っているTXの波形の信号論理が逆になっていることを確認できています
これで実際に信号論理がUARTとRS232Cで逆になっていることが十分に確認できました
余談_改造後のコンソール表示
半分余談になりますがせっかくなので、改造状態の場合Teretermのコンソール上ではどのように表示されるのかを確認してみます。
Enterを押すと改行されず「C」が返ってきます。
従来のUARTでのEnterの改行は「CR_0x0d」ですので逆値の[0xF2]になると思いきや全く異なる値になっています。このカラクリについて少し考えてみます
これは「信号論理が逆」「Start bitが送信と受信で2回ずれる」と、「ASCII文字が「0x7f」で終わっている」ことが影響していそうです。フローとしては下記流れだと思います
①USB-RS232C側から0x0d(CR)が送信される
0x0d= [10110000]
②ラズベリ-パイ側が受け取る際に「信号論理が逆」+「Start bitがずれる」0x79として受信する
0x79= [_10011110]
③ラズベリ-パイ側から0x79が送信される
0x79= [_10011110]
④USB-RS232C側が受け取る際に「信号論理が逆」+「Start bitがずれる」0xC3として受信する
0xC3= [__11000011]
さらにASCII文字は基本0x7fまでしかないので一番上のbitは無視され0x43として判断する
0x43= [__?1000011]
例えば①⇒②の「信号論理が逆」+「Start bitがずれる」イメージとしては先ほどの下記波形で見ると分かりやすいです
RS232Cをつなげる際は信号論理が逆になっていることを気にしないとデータが簡単に壊れてしまうので注意しましょう。
まとめ・感想
結局のところRS232CとUARTの違いとしては「①電圧レベルが異なること」「②信号論理が逆なこと」がメインだと思います。
この2つを忘れて接続するとICが壊れたり、データが壊れたりするので(筆者含めて)忘れないようにしないといけませんね。
データシート見て確認するのもいいですが、やはり実物の波形見ることでよりUART・RS232Cの理解が深まると思います。よろしければ皆様もアナライザを購入して確認してみてください
<<20190512追記>>
シリアル(uart)通信でRead/Write・ボーレート変更時の波形をアナライザで確認しました。
Pythonとraspberry piでテストして測定動画も撮っており、シリアル通信を分かりやすく説明した記事となっています。(リンク先はこちらから)
コメント
いつも楽しく拝見しております。
TC74HC4049APやTC74HC4050APのデータシートを見ると、入力電圧0~15V。
一方RS232Cの出力電圧は、H_+5V~+15V、L_-5V~-15V。
初心者の感覚では、RS232CのL出力(マイナス電圧)を、TC74HC4049APに入力してはいけないように思える(入力電圧の動作範囲がプラスなので壊れる?)のですが、
実際そうではないんですよね。。。難しい。。。