非連続都市伝説シリーズ:RS-232Cの信頼性はクソ

USBシリアルアダプタの粗製乱造が原因で、若者には強力な刷り込みがおこなわれたようです。

   


 

 

 

組み込みの開発やサーバの保守の現場でささやかれるのが、以下のような批判です。

   

   

RS-232Cって、なんでこんなクソなんだ。

    

ログの肝心な部分がちゃんと保存されねーじゃん。

    

catでちょっとしたテキストファイルを端末に流しただけで乱れるし、lessでページを送っただけで破綻するし。

    

こんなんだからPS/2みたいに廃れちゃったんだよな、きっと。

   

スーパーIOチップのシリアルポートなら、115200bpsでもそんな間抜けな事象は極めてめずらしいはずですが。 

 

個人的な経験としてはノンシールドのフラットケーブルを数m引き伸ばしたようないい加減な環境でフレームエラーが発生するのは理解できます。何百メートルも引き伸ばすなら485で差動が常識とかね。

   

ですが、巷のヤングが言う頻度ではありません。フラットケーブルならアルミホイルで巻いてクリップでグランドに落とすだけでメキメキ改善されますしね。

   

   

シリアルっつ~のはさ、

    

Rx,Tx,グランドの3本だけつないで、

    

双方向で文字通信するような、

    

化石並に低信頼性の権化みたいな通信だから。

   

とかヤングパーソンに言われて悔しい思いをするオサーンも多いかと思います。

   

もしTeraTermの仮想端末が乱れる原因が

    

   

バッファーオバーフロー

   

ならば、フロー制御を設定すれば解決するはずです。

   

しかしながら、どこの阿呆が広めたのか知りませんが、マッチ箱のデバッグ用シリアル出力にフロー用の信号ピンが割り付けられていないのがデフォルトになっています。

   

間抜けな組み込みプロセッサの解説には、

   

   

GPIOの一部をシリアルの制御信号に用いることは

    

可能ですが、極めて稀な応用です

   

などと書いてあるとかないとか。(要出典

   

 

   

フロー制御に対応するにはターゲットが対応する必要があります。TeraTermなどの仮想端末はほぼ対応しているので問題ありません。

   

しかし

   

   

マッチ箱のデバッグ用出力でフロー制御を許してしまうと、

    

ログ出力が動作に影響を与えてしまう・・・

   

という問題と、ハードフロー制御については、

   

   

3本芋半田で配線しただけのケーブル

    

ピン配置不明なシリアルケーブル

   

ばかりの現在世界では敷居が高そうです。

   

フロー制御の問題をクリアしてもなお、巷のUSBシリアルアダプタの中には想像を絶する低品質のものがあるようです。FIFOは名ばかりで役に立たず、信号ピン制御のioctrlはすべてスルー。クロックの逓倍率もいい加減なものがあるとか。(要出典

   

で、旧きよきRS-232C(EIA-232)を知っているベテランの人がいる現場では、

   

   

USBシリアルなんて使ったら作業効率悪くなるだけだよ

   

などといって、デスクトップにはRS-232Cのブラケットを設置し、ノートPCにはエクスプレスカードのシリアルアダプタを配布します。それが正しい対応のひとつです。

   

最近のデスクトップのパネルにはシリアルコネクタがなくなりつつあります。

   

   

   

 

   

もう少し進んだ現場ではイーサ・シリアル変換器を用いていることでしょう。

   

開発マシンすべてにRS-232Cのクチとケーブルを用意するという間抜けな環境から開放されます。

   

ヒントはデバイスサーバです。

   

   

高信頼性のものがほしければ、多ポートシリアルボードをPCに刺して、イーサ変換するデーモンを動かせばよいのです。

   

   

私はそういう環境で仕事をしたことがあります。最初はデバイスサーバデーモンの信頼性を疑いましたが、予想以上の安定稼動でしたので、後にはターゲットが大きいマッチ箱で物理的に移動しにくい場合、それがデフォルトの開発環境であるべきだとすら思いました。

   

信頼性の高いデバイスサーバデーモンを書いたり、シリアルアダプタをバカスカ購入するのはコスト的に困難かもしれませんが、ごみため的には、

   

   

USBシリアルでデバッグしている人が何十人もいたら

    

それって毎日何十万円もカネをドブに捨てているのに等しい・・・

   

と考えます。肝心なとき(=ログがいっぱいでてるとき)にログは正常に保存されず、デバッガーは頻繁に仮想端末を閉じたり開いたりします。ひどい場合には、ばらばらのログを結合する作業ばかりしている人が実際に存在します。

   

 

   

日本全国や全世界で考えると怖くなってきます。ですがそれがゲンジツです。
テクノロジの半分は生産性を下げるために存在する
のですから。

   

 

   

***

   

   

USBシリアルアダプタの中にもきわめて高信頼性のものがある

   

という主張をときどき耳にします。たいていそれは個人の環境に閉じた話で、検証が難しいのです。検証を難しくしている最大の原因はUSBシリアルアダプタが星の数ほどの種類存在して、すぐに同じものを入手できなくなるからです。

   

かなり困るのは、ベテランさんの環境でのみ「完璧に動作する」シリアルアダプタがある場合です。下っ端はベテランさんから「しょぼいPC使ってるから」「変なドライバ入れているから」などといわれ、永久に遠回りし続けます。

 

 

 

 

実際、シリアルUSBで起きる現象がどんなものかサンプルを載せておきます。

 

20110918120457最初は正常

 

しばらくすると、

 

   

エコーが1文字遅れる状態

 

になります。Linux端末なら「ls」と打つと、「 l」と表示される状態ですね。注意深い人なら、プロンプト「$」の右となりの空白が表示されないことに気づくでしょう。(何か一文字タイプするとこの空白が表示される)

 

 

 

この状態でlessとか使うとすぐに破綻します。

 

20110918120929もうぐちゃぐちゃ

 

「バッファがずれた」だけなら構わないのですが、そういうわけでもないのです。上記スクリーンショットはTeraTermのものですが、ログファイルもこのぐちゃぐちゃが記録されます。

 

サンプルアダプタ:

 

cg-usbrs232r

                     

         

コレガRS232C(シリアル9ピン)←→USB 変換ケーブル CG-USBRS232R [CGUSBRS232R]            

コレガRS232C(シリアル9ピン)←→USB 変換ケーブル CG-USBRS232R [CGUSBRS232R]             
価格:2,980円(税込、送料別)             

         

      

 

「ドライバをちゃんといれずに使うバカが喚いてるよ」という高尚な方向けに以下も載せておきます。

 

20110918124849

 

 

 

TeraTerm原因説については別途調べて記事にします。そりゃTeraTermにもバグはたくさんあるだろうけど。

(2011.10.04追記)

ちなみにマザーボード搭載のシリアルポートやPCカードのシリアルポートでは、上記現象はほとんど発生しません。ただし、RS-232は差動ではないので、コモンモードノイズなどザコキャラレベルのノイズにも負けてしまいます。たとえば強電機器のそばでは文字化けが散発的に発生したりします。パリティありならパリティエラーとか。ですが、調歩同期なら、エラーも文字単位に収まります。上記現象のように、いったん起こったエラーが永続化するのは、RS-232由来ではありません。

(2011.10.04追記おわり)

   

過去のシリアル:

   

尻ある? ごみため(ー日ー膳!)

   

   

わたしのサブマシンにはシリアルポートがありません。

   

ほかの都市伝説:

   

(非)連続都市伝説 ごみため(ー日ー膳!)