5月 282012
 

こんにちは、
今回は、パソコンと外部機器(シーケンサーや、計測機器)を接続するのにもっともポピュラーな
シリアルインターフェイスに関する話題です。

1999年に「PC2000」というパソコンの指針となる仕様がMicrosoft社から提唱されたのは
ご記憶でしょうか?

この「PC2000」では、パソコンへのシリアルポート搭載禁止が明記されています。
強制力はないものの、パソコン業界として事実上シリアルポート撤廃の流れが確立されました。

しかし、パソコンを道具の一つとして使用する様々なユーザはこのようなパソコン業界の都合など、
あまり関係ありません。

より使い慣れた、より手軽な、シリアルポートを手放すことはないのです。

当社のシリアルインターフェイスの製品にはPCI接続用やPCI Express接続用、USB接続用と
バリエーションがありますが、人気の高い製品はやっぱりUSB接続のシリアルインターフェイスです。
最近のPCにはシリアルインターフェイスを搭載しているものが少なく、また小型PCだと
他のインターフェイスボードが挿さっていると増設するところもありません。

そこで、当社ではUSB、PCIExpress、PCI、ExpressCard、PCカード、CFカードと
幅広いラインナップを開発、販売しており、
どのようなパソコンでもシリアルポートの増設が行えます。
なかでも、USB接続タイプ REX-USB60Fは、発売以来人気のモデルで、
USBに接続するだけでシリアルインターフェイスが手軽に増設できるのが人気の理由です。

さて、そのUSB接続のシリアルインターフェイスに大きな落とし穴があることをご存知でしょうか...
実際に当社のサポートセンターへの問い合わせがあったものを例にとって説明いたします。

お客様サポート内容
― 同じシリアルポート? ―

シリアルポートを使用するシーケンサー制御ソフトウェア開発依頼を受け、
ユーザへの納入を行いました。
ユーザが使用するPCにインストールが完了し、動作確認を行いましたが、動作しません。。。。
このソフトウェアは、動作確認もデバッグも終了したもので、
ユーザ様の使い方に間違いは無いようです。

いろいろと調査をさせていただいた結果、

当社のサポートセンターはプログラムの問題であると回答いたしました。

実はUSB接続のシリアルコンバーターには、プログラマーへの落とし穴があったのです。
それではこの落とし穴に付いて詳しく説明いたします。

■USB接続のシリアルコンバーターの動きを説明します

ドライバー内にある受信バッファとシリアルコンバーター内にあるFIFOの関係は
下の様になっています。

Serial Controler

シリアルデーターが受信されると最初にシリアルコントローラー内のFIFOに保存されます。
このFIFOからPCドライバーのバッファにデーターが送られるタイミングは

[1] シリアルコントローラー内のFIFOが384バイト(いっぱい)になった時
[2] 指定時間(デフォルト16mS)ドライバーのバッファへデーターが送られない時

この[2]の条件は注意が必要です。FIFOへデーターが保存されるタイミングと
指定時間(16mS)が重なった場合、次のようなことが発生します
(400バイトのデーターを連続して受信すると想定します。)
USBシリアルFIFO

3つ目まではFIFIOがいっぱいになるのですぐに送られますが
4つ目のパケットは16mSにバッファへ渡されることになります。
(FIFOがいっぱいにならなかったため)

お客様のプログラムはシリアル受信イベントを処理するように作られていまして、
受信が発生するとすぐにデーターを取り込んで処理するように出来ていました。
実際は最後のデーターまでバッファには取り込まれていなかったのです。
受信したバイト数をチェックする様にプログラミングを修正することで問題は回避できましたが、
不具合の原因がわかるまで、大切な時間を失うこととなりました。
あなたも同じ落とし穴にはまらないように....

次回は今回に続き「続PCI(PCI Express)接続のシリアルインターフェイスとUSBインターフェイスの違い」を記載予定です。


関連記事
USBシリアルインターフェイスと他のシリアルインターフェイスの違い(その2)


この記事で紹介した製品

REX-USB60F製品画像
REX-USB60F - USBシリアルコンバータ

 返信する

以下のHTML タグと属性が利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(必須)

(必須)

*