シリアル通信の上限は?

ふと気になったことがあって、マイコンのデバッグで使うUART通信、

評価ボードだとUSB-UARTブリッジICが搭載されていて接続できたり、

あるいはRS-232Cに変換してPCと接続したり……

このときよく使われる通信速度として115200bpsというのがあるが、なんでこのスピードなんでしょうね?


そもそもUARTというのは調歩同期式シリアル通信の代表的なもので、

調歩同期式というのは信号線1本で通信を完結できる仕組みである。

一般的には送信・受信を分けて全二重にすることが多いが、それでも2本である。

SPI通信だとクロック・チップセレクト信号も伝達することが通常だが、

UARTではスタートビットの送信で通信開始を示し、

それを合図に取り決めたボーレートで順番にデータをやりとりして、

最後にストップビットをやりとりしたら1byte送信完了となっている。


UART通信を正しくやる上で肝心なのが時間精度である。

例えば9600bpsで通信する場合、104.2us周期で送信側は信号を切替、受信側はサンプリングしなければならない。

スタートビットからストップビットまでの間に1bitズレると通信に失敗する。

高速になるほど、これがシビアになるので難しい?


とはいえ、その上限が115200bpsとも思えないところはある。

確かにあるシステムでは同じ基板の上に乗ったマイコン同士が1MbpsのUART通信をしている。

なぜUARTなのかというと、この間に絶縁素子があるからである。

信号線1本(往復で2本)で伝達できるというのは絶縁という点でも有利である。

UARTというのはシンプルな方式なので、それ自体に上限はなさそうで、

問題は経路とインターフェースということになろうかと思う。

さっきの例だと絶縁素子のスピードで決まる部分が多いかと思う。

あるいはマイコンのUART機能はクロック周波数の8分周が最速とか決められてるので、

そういうところで最高速度が決まるということである。


通信相手がPCの場合に問題となりそうなのは、RS-232Cという伝送経路と、

USB-UARTブリッジICの性能というところが問題ではないかと思う。

今どきPC自体にRS-232Cが搭載されているということはそうそうなくて、

一般的にはUSB接続のRS-232Cインターフェースと組み合わせて使うが、

その内部にはUSB-UARTブリッジICが搭載されているのが通常である。

それをRS-232Cで引き出した先におくか、評価ボード上に置くかの違いである。


まず、RS-232Cの最高速度だが、規定上は20kbpsとなっているらしい。

この範囲内に入るボーレートでよく使われるのが9600bpsと19200bpsだが……

明らかにこれは実態に合っていなくてRS-232Cはもっと高速な通信で使われることは多い。

無難な数字として9600bpsとか19200bpsが使われることはあるが。

現実的な上限は150~250kbpsぐらいの範囲にあることが多いようだ。

ある基板に搭載されていたRS-232Cのドライバ/レシーバICではMaximum Data Rateは150kbps(min.)となっていた。

このICを介して行うRS-232Cの通信は150kbpsが上限になるということで、

冒頭に書いた115200bpsはその上限に近い数字である。

というか115200bpsの通信は通せる仕様ということでこうしたんじゃないか。


もう1つの要素としてはUSB-UARTブリッジICの対応速度がある。

1Mbpsぐらいは対応しているものが多いようである。

もう少し速くて2Mbpsとか3Mbpsとか対応したものもあるようだけど。

基板上で完結する通信ならば少なくとも1Mbpsぐらいは対応できるとみられるので、

USB-UARTブリッジICを基板上に置けばそのあたりが現実的な上限なのだろう。


というわけで115200bpsというのは現代的なシステムではほぼ対応できるボーレートで比較的速いものとして選ばれたのではないかと思う。

RS-232Cを通すとなると、さらに倍速の230400bpsが通るか通らないかというところ。

堅いのは115200bpsまでということなんだろう。

ただ、UARTという通信方式そのものは1Mbps程度までは対応可能で、

インターフェースや通信経路をよくよく精査すればより高速化は可能かもしれないと。


なんでこんな話を書いたかというと10MbyteぐらいあるデータをROMに書くのに、

マイコンにUARTで送って書き込んでもらうことを考えたのだが、

10Mbyteのデータを115200bpsで送ることを考えると、

UARTで1byte送るにはスタートビット+8bit+ストップビット=10bit送る必要があるので、

所要時間は 10×106×10/115200=868sと求まる。

868秒と言われてもピンとこないが、60で割ると14.5分である。

データ送信プロトコル(例えばYMODEM)のオーバーヘッドなど加味せずにこれだけかかるのである。


で、速くする余地はあるのかと考えたのだが、

まず最初に考えたのはデータ圧縮、ただ、すでに圧縮されているのか効果が見いだせなかった。

効果があればzlibとか組み込んでDeflateしたデータを送るとか考えたけど。

となると、通信速度自体を上げたいと調べたがRS-232Cを介する場合はこれが現実的な上限であると。

1Mbpsまで速くできれば100sだから、2分ぐらいで送信できる計算で、

これだとそんなに悪くない気がするが、さすがに15分は遅いなと。

というわけでシリアル通信で送る作戦は手軽でよいと思ったのだが、

こうも遅いとあまりよい方法ではないと思った。

他の手段がなければ15分かかっても仕方ないですけど。


結論から言えば、以前紹介したICEからプログラムでは無いものを書く方式が速かった。

ICEからプログラムでは無いものを書く

書き込み先のROMはマイコンのプログラムを格納するROMではなかったが、

マイコンには接続されているので、同じような書き込み方をすることはできた。

マイコンのデバッグインターフェースの速度次第だとは思うのだが、

一般的に考えればUARTよりは速いわけで、データ転送だけ考えれば速い。

あとはオーバーヘッドなど総合的に見てどうかという話ではあるけど、

数分で書き込み完了できたので、この方法がよいと思った。

ただ、ICEで接続できる場合に限られるので、やはりシリアル通信で書き込みたい話もあるかもしれない。