電子機器及び通信システム
【課題】非対称な伝送路で擬似的に全二重通信を行うことができる電子機器及び通信システムを提供する。
【解決手段】シーケンス番号記憶手段、及びシーケンス番号更新手段を具備する。シーケンス番号記憶手段は通信に用いられる第1シーケンス番号を格納する。生成手段は、データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成する。送信手段は外部デバイスに前記第1データユニットを送信する。受信手段は前記外部デバイスから第2シーケンス番号を含む第2データユニットを受信する。シーケンス番号更新手段は、前記第2シーケンス番号を用いて前記格納された第1シーケンス番号を更新する。送信手段は、前記受信手段により前記第2データユニットが受信された後に、前記新たなデータと前記シーケンス番号更新手段により更新された第1シーケンス番号とを含む新たな第1データユニットを送信する。
【解決手段】シーケンス番号記憶手段、及びシーケンス番号更新手段を具備する。シーケンス番号記憶手段は通信に用いられる第1シーケンス番号を格納する。生成手段は、データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成する。送信手段は外部デバイスに前記第1データユニットを送信する。受信手段は前記外部デバイスから第2シーケンス番号を含む第2データユニットを受信する。シーケンス番号更新手段は、前記第2シーケンス番号を用いて前記格納された第1シーケンス番号を更新する。送信手段は、前記受信手段により前記第2データユニットが受信された後に、前記新たなデータと前記シーケンス番号更新手段により更新された第1シーケンス番号とを含む新たな第1データユニットを送信する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、近接無線通信を実行する電子機器及び通信システムに関する。
【背景技術】
【0002】
近年、ICカード、携帯電話機等においては、NFCのような無線通信が利用され始めている。ユーザは、ICカード又は携帯電話をホスト装置のリーダ/ライタ部にかざすといった操作を行うだけで、認証、課金等のための通信を容易に行うことができる。
【0003】
また、最近では、デバイス間の高速なデータ伝送を可能にする新たな近接無線通信技術も開発され始めている。
【0004】
このようなデータ伝送では、例えば、一方のデバイスをマスタ(ソース)とし、他方のデバイスをスレーブ(シンク)とすることによって非対称なデータ伝送を行うことがある。非対称なデータ伝送では、一つ前のフレームに対応するデータ伝送が完了してから、次のフレームの送信が開始されるまでの待ち時間(フレーム間スペース)が、マスタとスレーブとで異なるように設定される。すなわち、マスタによるデータ送信を優先的に行うために、マスタの待ち時間がスレーブの待ち時間よりも短く設定される。これにより、マスタによるデータ送信が連続して要求されている間、マスタは途切れることなくデータを送信することができる。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2008−79045号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかし、マスタの待ち時間がスレーブの待ち時間よりも短く設定されるので、前のフレームの送信が完了した後、マスタとスレーブとが共にデータの送信を待っているとき、マスタによるデータ送信がスレーブによるデータ送信よりも常に先に要求される。つまり、マスタによるデータ送信が連続して要求されている間、スレーブが割り込んでデータを送信することはできない。したがって、ステータスの変更のような緊急度が高いデータを送信したい場合であっても、スレーブはデータを送信することができない可能性がある。
【0007】
本発明は、非対称なデータ伝送を行うための伝送路で、擬似的に全二重通信を行うことができる電子機器及び通信システムを提供することを目的とする。
【課題を解決するための手段】
【0008】
実施形態によれば、電子機器は、通信モジュール、シーケンス番号記憶手段、データユニット生成手段、データユニット送信手段、データユニット受信手段、及びシーケンス番号更新手段を具備する。通信モジュールは、外部デバイスとの通信を実行する。シーケンス番号記憶手段は、前記通信に用いられる第1シーケンス番号を格納する。データユニット生成手段は、データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成する。データユニット送信手段は、前記通信モジュールを用いて、前記外部デバイスに前記第1データユニットを送信する。データユニット受信手段は、前記通信モジュールを用いて、前記外部デバイスから第2シーケンス番号を含む第2データユニットを受信する。シーケンス番号更新手段は、前記第2シーケンス番号を用いて前記格納された第1シーケンス番号を更新する。データユニット送信手段は、前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記データユニット受信手段により前記第2データユニットが受信された後に、前記新たなデータと前記シーケンス番号更新手段により更新された第1シーケンス番号とを含む新たな第1データユニットを送信する。
【図面の簡単な説明】
【0009】
【図1】実施形態に係る電子機器の構成を示すブロック図。
【図2】同実施形態の電子機器と外部デバイスとの間で実行される近接無線通信の例を示す図。
【図3】同実施形態の電子機器に適用される、近接無線通信を制御するためのソフトウェアアーキテクチャの例を示す図。
【図4】同実施形態の電子機器に適用される、擬似的な全二重通信を制御するためのソフトウェアアーキテクチャの例を示す図。
【図5】近接無線通信での非対称な通信を説明するための概念図。
【図6】図5に示す非対称な通信による通信シーケンスの例を示す図。
【図7】同実施形態の電子機器によって実行される通信制御プログラムの機能構成の例を示すブロック図。
【図8】同実施形態の電子機器によって用いられるデータユニットを説明するための図。
【図9】同実施形態の電子機器によって用いられるデータユニットの構成の例を示す図。
【図10】同実施形態の電子機器によって用いられるデータユニットの構成の例を説明するための図。
【図11】同実施形態の電子機器によって用いられる、近接無線通信を制御するためのコマンドの例を示す図。
【図12】同実施形態の電子機器によって実行されるデータ通信の階層的な通信シーケンスの例を示す図。
【図13】同実施形態の電子機器によって実行されるデータ通信の階層的な通信シーケンスの別の例を示す図。
【図14】同実施形態の電子機器によって実行されるデータ通信の階層的な通信シーケンスのさらに別の例を示す図。
【図15】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第1の例を示す図。
【図16】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第2の例を示す図。
【図17】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第3の例を示す図。
【図18】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第4の例を示す図。
【図19】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第5の例を示す図。
【図20】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第6の例を示す図。
【図21】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第7の例を示す図。
【図22】同実施形態の電子機器によって実行される通信制御処理の手順の例を示すフローチャート。
【図23】同実施形態の電子機器によって実行される通信制御処理の手順の別の例を示すフローチャート。
【発明を実施するための形態】
【0010】
以下、実施の形態について図面を参照して説明する。
図1は、本発明の一実施形態に係る電子機器の構成を示している。この電子機器は、例えば、携帯機器(例えば、携帯電話機、PDA、オーディオプレーヤ、補助記憶媒体等)、パーソナルコンピュータ、又はコンシューマ機器(例えば、TV、ビデオレコーダ等)として実現される。この電子機器は近接無線通信を実行する通信モジュールを備えており、近接無線通信機能を有する他のデバイス(外部デバイス)との無線接続を確立し、そして外部デバイスとの近接無線通信をピアツーピア形式で実行する。
【0011】
この電子機器10は、システム制御部101、ROM102、RAM103、近接無線通信デバイス104、電源制御部105、ACアダプタ106、バッテリ107、及び記憶装置108を備える。
【0012】
システム制御部101は、電子機器10内の各部の動作を制御する。システム制御部101は、CPU101aを備え、ROM102、RAM103、近接無線通信デバイス104、電源制御部105、及び記憶装置108に接続される。
【0013】
CPU101aは、ROM102に格納された命令群及びデータをRAM103へロードし、必要な処理を実行するプロセッサである。RAM103には、近接無線通信を制御するための通信制御プログラム109がロードされている。CPU101aは、RAM103にロードされた通信制御プログラム109を実行して、近接無線通信デバイス104を制御する。
【0014】
近接無線通信デバイス104は、近接無線通信を実行する通信モジュールである。近接無線通信デバイス104は、近接無線通信デバイス104から所定の距離内に存在する、近接無線通信機能を有する他のデバイス(外部デバイス)との無線接続を確立し、そしてファイルのようなデータの伝送を開始する。近接無線通信デバイス104と外部デバイスとの間の近接無線通信は、ピアツーピア形式で実行される。通信可能距離は例えば3cmである。近接無線通信デバイス104と外部デバイスとの間の無線接続は、近接無線通信デバイス104と外部デバイスとが近接状態である場合、つまり近接無線通信デバイス104と外部デバイスとの間の距離が通信可能距離(例えば3cm)以内に接近した場合に可能となる。近接無線通信デバイス104と外部デバイスとが通信可能距離以内に接近した時、近接無線通信デバイス104と外部デバイスとの間の無線接続が確立される。そして、例えば、外部デバイスは、記憶装置108内の所定の記憶領域へアクセスし、所定の記憶領域からのデータファイルの読み出しや、所定の記憶領域へのデータファイルの書き込み等によるデータの伝送が、近接無線通信デバイス104と外部デバイスとの間で実行される。
【0015】
近接無線通信においては、誘導電界が用いられる。近接無線通信方式としては、例えばTransferJetを使用し得る。TransferJetは、UWBを利用した近接無線通信方式であり、高速データ転送を実現することができる。
【0016】
近接無線通信デバイス104はアンテナ104aに接続されている。アンテナ104aはカプラと称される電極であり、誘導電界を用いた無線信号により、外部デバイスに対するデータの送受信を行う。外部デバイスがアンテナ104aから通信可能距離(例えば3cm)以内の範囲内に接近した場合、近接無線通信デバイス104及び外部デバイスそれぞれのアンテナ(カプラ)間が誘導電界によって結合され、これによって近接無線通信デバイス104と外部デバイスとの間の無線通信が実行可能となる。なお、近接無線通信デバイス104及びアンテナ104aは、一つのモジュールとして実現し得る。
【0017】
電源制御部105は、ACアダプタ106を介して外部から供給される電力、又はバッテリ107から供給される電力を用いて、電子機器10内の各部に電力を供給する。換言すれば、電子機器10は、AC商用電源のような外部電源、又はバッテリ107によって駆動される。ACアダプタ106は電子機器10内に設けることもできる。
【0018】
図2には、2つのデバイス間で実行される近接無線通信の様子が示されている。
ここでは、デバイスAが携帯電話から構成され、デバイスBがポータブルコンピュータから構成されている場合を想定する。ユーザは、例えば、デバイスAをデバイスBに近接させるという操作(タッチ操作)を行うことにより、デバイスA,B間のデータ転送を開始させることができる。デバイスA,B間のデータ転送は、デバイスA,Bが互いに近接したことをトリガに実行される。上述の電子機器10は、デバイスAとデバイスBのどちらとしても機能し得る。
【0019】
図3は、近接無線通信デバイス104を用いて実行される近接無線通信を制御するためのソフトウェアアーキテクチャを示す。
図3のソフトウェアアーキテクチャは近接無線通信を制御するためのプロトコルスタックの階層構造を示している。プロトコルスタックは、物理層(PHY)21、コネクション層(CNL)22、プロトコル変換層(PCL)23、アプリケーション層24から構成されている。例えば、コネクション層(CNL)22、プロトコル変換層(PCL)23、アプリケーション層24は通信制御プログラム109によって実現し得る。
【0020】
物理層(PHY)21は物理的なデータ転送を制御する層であり、OSI参照モデル内の物理層に対応する。物理層(PHY)21の一部の機能又は全ての機能は、近接無線通信デバイス104内のハードウェアを用いて実現することもできる。物理層(PHY)21は、コネクション層(CNL)22からのデータを無線信号に変換する。
【0021】
コネクション層(CNL)22は、OSI参照モデル内のデータリンク層及びトランスポート層に対応しており、近接状態に設定されている近接無線通信デバイス104と外部デバイスとの間の接続(CNL接続)を確立/解除し、データを伝送する処理を実行する。
【0022】
プロトコル変換層(PCL)23は、OSI参照モデル内のセッション層及びプレゼンテーション層に対応しており、アプリケーション層24と、デバイスA,B間の接続の確立及び解除を制御するためのコネクション層(CNL)22との間に位置する。プロトコル変換層(PCL)23は、アプリケーション層24内の各アプリケーション(通信プログラム)の管理と、セッション制御とを実行する。セッションは、電子機器10のアプリケーション層24と外部デバイスのアプリケーション層との間の通信路(伝送路)に相当する。
【0023】
より具体的には、プロトコル変換層(PCL)23は、アプリケーション層24の各通信プログラムが扱うアプリケーションプロトコル(ユーザプロトコルとも称する、例えば、SCSI、OBEX、他の汎用プロトコル等)に対応したデータ(ユーザデータ)を特定の伝送用データ形式に変換するための変換処理を実行する。この変換処理により、いずれの通信プログラムによって送受信されるデータであっても、コネクション層(CNL)22が扱うことが可能なパケット(特定の伝送用データ形式のデータ)に変換することができる。このプロトコル変換層(PCL)23は、さまざまなアプリケーションプロトコルを近接無線通信で利用することを可能にする。
【0024】
また、プロトコル変換層(PCL)23は、通信相手のデバイスとの間でサービス情報(各デバイスが提供可能なサービスを示す情報)及びセッション情報(確立/切断対象のセッションに関する情報)を交換する処理、さらに、アプリケーションの起動、コネクションの管理、及びセッションの管理等を行う。
【0025】
アプリケーション層24は、SCSI、OBEX、他の汎用プロトコル等の幾つかのアプリケーションプロトコルにそれぞれ対応した複数の通信プログラム(アプリケーション)を含んでいる。各アプリケーションは、プロトコル変換層(PCL)23に対してサービス(セッション)の開始/終了を要求する処理、及びプロトコル変換層(PCL)23を介してデータを送受信する処理を実行する。
【0026】
また、図4は、図3に示した階層と階層間の関係を実現するためのサービスアクセスポイント(SAP)との例を示す。サービスアクセスポイントは、隣接する階層間において、一方の階層から他方の階層に要求や応答等のコマンドを伝えるためのインタフェースである。物理層サービスアクセスポイント(PHY SAP)21aは、物理層21とコネクション層(CNL)22との間のインタフェースである。コネクション層サービスアクセスポイント(CNL SAP)22aは、コネクション層(CNL)22とプロトコル変換層(PCL)23との間のインタフェースである。
【0027】
また、プロトコル変換層(PCL)23は、プロトコル変換層コントローラ(PCLコントローラ)231とプロトコル変換層シリアルアダプタ(PCLシリアルアダプタ)232とを備える。PCLコントローラ231及びPCLシリアルアダプタ232は、コネクション層(CNL)22を介して、外部デバイスとの通信を行う。PCLコントローラ231は、アプリケーションマネージャ241に対して、接続の確立や解除、認証等の共通のサービスを提供する。PCLシリアルアダプタ232は、シリアルプロトコル(EIA/TIA−232−E)に対応するデータを、コネクション層(CNL)22が扱うことが可能なパケットに変換することができるPCLアダプタである。PCLシリアルアダプタ232は、PCLコントローラ231によって接続が確立された後にデータを伝送する。なお、プロトコル変換層(PCL)23は、他のユーザプロトコル(例えば、OBEX、他の汎用プロトコル等)に対応するデータを、コネクション層(CNL)22が扱うことが可能なパケットに変換することができる複数のPCLアダプタを備えてもよい。その場合、複数のPCLアダプタの内、PCLコントローラ231によって選択された一つのPCLアダプタが起動される。
【0028】
アプリケーション層24は、アプリケーションマネージャ241とポートエミュレータ242とを備える。アプリケーションマネージャ241は、通信を要求する各種のアプリケーションプログラムを管理し、通信に用いられるプロトコルに応じて、PCLコントローラサービスアクセスポイント231aを介してPCLコントローラ231を制御する。ポートエミュレータ242は、シリアルプロトコルによる通信をエミュレートするためのプログラムである。ポートエミュレータ242は、各種のアプリケーションプログラムによって、シリアルプロトコルに基づくデータ伝送サービスが実行されるとき、データの送受信等に応じたコマンドを生成する。そして、ポートエミュレータ242は、PCLシリアルサービスアクセスポイント232aを介して、PCLシリアルアダプタ232に対してコマンドを出力する。
【0029】
PCLコントローラ231は、アプリケーションマネージャ241による制御の下、PCLコントローラ231と外部デバイスのPCLコントローラとの間で、起動するアダプタのネゴシエーションを実行する。ここで、シリアルアダプタが選択された場合、PCLシリアルアダプタ232が起動される。PCLシリアルアダプタ232は、ポートエミュレータ242によって出力されたコマンドに応じて、外部デバイスとのシリアルプロトコルによる通信を実行する。
【0030】
なお、コネクション層(CNL)22では、外部デバイスにサービスの開始を要求するデバイス(以下、Initiatorと称する)をマスタとし、外部デバイスから送信されるサービスの開始要求を受信するデバイス(以下、Responderと称する)をスレーブとして通信(サービス)が実行される。Initiatorは、通信相手のデバイスを制御してデバイス間のデータ転送のようなサービスを実行する。Responderは、通信相手のデバイスの制御の下、デバイス間のデータ転送のようなサービスを実行する。上述の電子機器10は、InitiatorとResponderのどちらとしても機能し得る。コネクション層(CNL)22では、Initiatorによって送信されるデータ(データユニット)の優先度が、Responderによって送信されるデータ(データユニット)の優先度よりも高く設定され、非対称な通信が実行される。
【0031】
図5を参照して、この非対称な通信が実行される際に、InitiatorとResponderとによって送信されるデータユニットの例について説明する。図5に示す例では、Initiatorによって送信されるデータユニットの優先度を、Responderによって送信されるデータユニットの優先度よりも高く設定するために、一つ前のフレーム(コマンド)の処理が完了してからのInitiatorの通信待ち時間(IIFSとも称する、例えば8.5マイクロ秒)が、Responderの通信待ち時間(RIFSとも称する、例えば15.7マイクロ秒)よりも短く設定されている。InitiatorとResponderの双方が通信を要求する場合、InitiatorがIIFSだけ待って通信を要求し、ResponderがRIFSだけ待って通信を要求するので、常にInitiator側の通信が先行して実行される。そのため、図6のように、Initiator側が大量のデータを送信する場合、Initiatorが一連の送信シーケンス(S11〜S16)を完了するまで、Responderはデータを送信すること(S17)ができない。例えば、Responderは、ステータスの変更などの緊急度が高いデータを送信したいときであっても、Initiatorによるデータ送信が途切れるまで、データ送信を開始する(割り込む)ことができない。
【0032】
プロトコル変換層(PCL)23のPCLシリアルアダプタ232は、アプリケーション層24で、シリアルプロトコルのような全二重通信を実行するプロトコルを用いたプログラム(すなわち、上述のポートエミュレータ242を用いたプログラム)を実行するために、擬似的な全二重通信(Pseudo Full Duplex Emulation)を実行するための機能を有する。つまり、PCLシリアルアダプタ232は、Initiatorによってデータが送信されている途中であっても、Responderが待たされることなく割り込んでデータを送信できる機能を実現する。
【0033】
図7は、擬似的な全二重通信を実行するための通信制御プログラム109の機能構成の例を示す。すなわち、通信制御プログラム109はPCLシリアルアダプタ232の動作を実現するプログラムである。図7の例では、Initiatorとして動作するための通信制御プログラム109aの構成と、Responderとして動作するための通信制御プログラム109bの構成とを示すが、1つの通信制御プログラム109が通信制御プログラム109aの構成と通信制御プログラム109bの構成とを備えてもよい。すなわち、電子機器10がInitiatorとして動作するとき、通信制御プログラム109aの構成によって通信処理が実行され、電子機器10がResponderとして動作するとき、通信制御プログラム109bの構成によって通信処理が実行される。
【0034】
ここで、Initiatorとして動作する第1デバイスとResponderとして動作する第2デバイスとは、近接状態にあり、第1デバイスに設けられた近接無線通信デバイスと第2デバイスに設けられた近接無線通信デバイスとの間で接続(CNL接続)が確立されていることを想定する。図5及び図6を参照して説明したように、コネクション層(CNL)22での第1デバイス(Initiator)のデータ伝送は、第2デバイス(Responder)のデータ伝送よりも優先して実行される。また、接続開始時のネゴシエーションによって、PCLコントローラ231によってPCLシリアルアダプタ232が選択されたこと(すなわち、通信プロトコルとしてシリアルプロトコルが選択されたこと)を想定する。したがって、第1デバイスでは通信制御プログラム109aが実行され、第2デバイスでは通信制御プログラム109bが実行される。
【0035】
第1デバイス(Initiator)上で実行される通信制御プログラム109aは、一つのデータユニットを第2デバイス(Responder)に送信した後、Responderから一つのデータユニットを受信するまで、次のデータユニットの送信を待つように通信を制御する。つまり、Responderから一つのデータユニットを受信した後に、新たに一つのデータユニットを送信することができる。通信制御プログラム109aは、初期化部31、通信制御部32、データユニット生成部33、データユニット送信部34、タイムアウト検出部35、データユニット受信部36、シーケンス番号更新部37等を備える。
【0036】
初期化部31は、PCLコントローラ231によってPCLシリアルアダプタ232が選択(起動)されたとき、初期化処理を実行する。初期化部31は、例えば、Initiatorシーケンス番号38を初期化する、すなわち、Initiatorシーケンス番号38に0を設定する。Initiatorシーケンス番号38は、InitiatorとResponderとの間のデータ伝送を制御するために用いられる。Initiatorシーケンス番号38は、例えば、メモリ103内の領域に格納される。初期化部31は、初期化が完了したことを通信制御部32に通知する。
【0037】
通信制御部32は、送信待ちのデータ39があるか否か(又はポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する。通信制御部32は、送信待ちのデータ39がある場合、データユニット生成部33にデータユニットの生成を要求する。なお、送信待ちデータ39は、例えば、メモリ103内の領域に格納されている。送信待ちデータ39は、ポートエミュレータ242によって出力される送信要求コマンドに指定された、送信対象のデータである。データがデータユニットのペイロードとして送信された後、当該データはメモリ103から削除される。データのサイズが、一つのデータユニットのペイロードとして送信できるサイズよりも大きい際には、そのサイズに応じて分割して送信されるので、送信が完了したデータ部分がメモリ103から削除される。
【0038】
データユニット生成部33は、通信制御部32による要求に応じて、送信待ちデータ39とInitiatorシーケンス番号(第1シーケンス番号とも称する)38とを含むデータユニット(第1データユニットとも称する)を生成する。なお、Initiatorシーケンス番号38は、例えば、データユニット内のヘッダ部分に記述される。データユニット生成部33は、生成したデータユニットをデータユニット送信部34に出力する。
【0039】
データユニット送信部34は、データユニット生成部33によって出力されたデータユニットを外部デバイス(外部デバイスのデータユニット受信部46)に送信する。データユニット送信部34は、データユニットを送信したことをタイムアウト検出部35に通知する。
【0040】
タイムアウト検出部35は、データユニットが送信されてからの経過時間を計測する。そして、タイムアウト検出部35は、計測した時間がしきい値時間(例えば、1ミリ秒)を超えたか否か、すなわち、タイムアウトを検出する。タイムアウト検出部35は、タイムアウトが検出されたことを通信制御部32に通知する。
【0041】
また、データユニット受信部36は、外部デバイスによって送信されたデータユニットを受信する。外部デバイスからデータユニットを受信した場合、データユニット受信部36は、受信したデータユニットに含まれるシーケンス番号(第2シーケンス番号とも称する)を読み出す。そして、データユニット受信部36は、読み出したシーケンス番号をシーケンス番号更新部37に出力する。また、データユニット受信部36は、受信したデータユニットに含まれるデータ(受信データ)を読み出す。そして、データユニット受信部36は、読み出した受信データを通信制御部32に出力する。
【0042】
シーケンス番号更新部37は、データユニット受信部36によって出力されたシーケンス番号を用いて、メモリ13等に格納されているInitiatorシーケンス番号38を更新する。つまり、Initiatorシーケンス番号38に、受信したデータユニットに含まれるシーケンス番号が設定される。
【0043】
通信制御部32は、データユニット受信部36によって出力された受信データを、ポートエミュレータ242等を介して所定のアプリケーションプログラムに出力する。アプリケーションプログラムは、受信データを用いて所定の処理(例えば、データのバックアップ処理等)を実行する。なお、通信制御部32は、メモリ103内の所定の領域に受信データを格納することによって、アプリケーションプログラムに受信データを渡してもよい。
【0044】
また、通信制御部32は、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信した後、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信するまで、新たなデータユニットが外部デバイスに送信されることを待つように、通信制御プログラム109a内の各部を制御する。つまり、通信制御部32は、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信した後に、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信したとき、新たなデータユニットの送信を許可する。又は、通信制御部32は、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信した後、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信せずに、タイムアウト検出部35によってタイムアウトが検出されたとき(すなわち、データユニットを送信してからの経過時間がしきい値を超えたとき)、新たなデータユニットの送信を許可する。
【0045】
したがって、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信し、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信した後に、通信制御部32は、上述のようにデータユニット生成部33及びデータユニット送信部34を介して、シーケンス番号更新部37によって更新されたInitiatorシーケンス番号38とデータとを含む新たなデータユニットを外部デバイスに送信する。また、タイムアウト検出部35によってタイムアウトが検出された際には、通信制御部32は、上述のようにデータユニット生成部33及びデータユニット送信部34を介して、Initiatorシーケンス番号38(更新されていないInitiatorシーケンス番号38)とデータとを含む新たなデータユニットを外部デバイスに送信する。
【0046】
なお、タイムアウト検出部35は、データユニット送信部34によって一つデータユニットが送信されてからの経過時間を計測している間に、データユニット受信部36によって一つのデータユニットが受信された場合、経過時間の計測を終了してもよい。また、データユニット受信部36によって、データを含まないデータユニット(ACK)が受信され、且つデータユニット送信部34によって次に送信される新たなデータユニットがデータを含まない場合、タイムアウト検出部35は、データユニット送信部34によって一つデータユニットが送信されてからの経過時間を計測しなくてもよい、すなわち、タイムアウトを検出しなくてもよい。
【0047】
次いで、第2デバイス(Responder)上で実行される通信制御プログラム109bは、第1デバイス(Initiator)にデータユニットを送信することが要求されたとき、Responder内に格納されるResponderシーケンス番号48をインクリメントし、インクリメントされたResponderシーケンス番号48を含むデータユニットを送信するように通信を制御する。通信制御プログラム109bは、初期化部41、通信制御部42、シーケンス番号更新部43、データユニット生成部44、データユニット送信部45、データユニット受信部46、シーケンス番号判定部47等を備える。
【0048】
初期化部41は、PCLコントローラ231によってPCLシリアルアダプタ232が選択(起動)されたとき、初期化処理を実行する。初期化部41は、例えば、Responderシーケンス番号48を初期化する、すなわち、Responderシーケンス番号48に0を設定する。Responderシーケンス番号48は、InitiatorとResponderとの間のデータ伝送を制御するために用いられる。Responderシーケンス番号48は、例えば、メモリ103内の領域に格納される。初期化部41は、初期化が完了したことを通信制御部42に通知する。
【0049】
通信制御部42は、送信待ちのデータ49があるか否か(又はポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する。通信制御部42は、送信待ちのデータ49がある場合、シーケンス番号更新部43に、Responderシーケンス番号48の更新を要求する。なお、送信待ちデータ49は、例えば、メモリ103内の領域に格納されている。送信待ちデータ49は、ポートエミュレータ242によって出力される送信要求コマンドに指定された、送信対象のデータである。データがデータユニットのペイロードとして送信された後、当該データはメモリ103から削除される。データのサイズが、一つのデータユニットのペイロードとして送信できるサイズよりも大きい際には、そのサイズに応じて分割して送信されるので、送信が完了したデータ部分がメモリ103から削除される。
【0050】
シーケンス番号更新部43は、通信制御部42による要求に応じて、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48を更新する。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。そして、シーケンス番号更新部43は、Responderシーケンス番号48が更新されたことをデータユニット生成部44に通知する。
【0051】
データユニット生成部44は、シーケンス番号更新部43による要求に応じて、送信待ちデータ49があるか否かを判定する。そして、送信待ちデータ49がある場合、データユニット生成部44は、送信待ちデータ49と更新されたResponderシーケンス番号48とを含むデータユニット(第2データユニットとも称する)を生成する。また、送信待ちデータ49がない場合、データユニット生成部44は、Responderシーケンス番号48を含むACKを生成する。Responderシーケンス番号48を含むACKは、換言すると、データを含まないデータユニット(データ長0の第2データユニット)である。なお、Responderシーケンス番号48は、例えばデータユニット内のヘッダ部分に記述される。データユニット生成部44は、生成したデータユニット又はACKをデータユニット送信部45に出力する。
【0052】
データユニット送信部45は、データユニット生成部44によって出力されたデータユニットを外部デバイス(外部デバイスのデータユニット受信部36)に送信する。
【0053】
また、データユニット受信部46は、外部デバイスによって送信されたデータユニットを受信する。外部デバイスからデータユニットを受信した場合、データユニット受信部46は、受信したデータユニットに含まれるシーケンス番号(Initiatorシーケンス番号38)を読み出す。そして、データユニット受信部46は、読み出したシーケンス番号をシーケンス番号判定部47に出力する。また、データユニット受信部46は、受信したデータユニットに含まれるデータ(受信データ)を読み出す。そして、データユニット受信部46は、読み出した受信データを通信制御部42に出力する。
【0054】
通信制御部42は、データユニット受信部46によって出力された受信データを、ポートエミュレータ242等を介して所定のアプリケーションプログラムに出力する。アプリケーションプログラムは、受信データを用いて所定の処理(例えば、バックアップデータの更新処理等)を実行する。なお、通信制御部42は、メモリ103内の所定の領域に受信データを格納することによって、アプリケーションプログラムに受信データを渡してもよい。
【0055】
また、シーケンス番号判定部47は、データユニット受信部46によって出力されたシーケンス番号と、メモリ103等に格納されたResponderシーケンス番号48とが等しいか否かを判定する。シーケンス番号判定部47は、データユニット受信部46によって出力されたシーケンス番号(すなわち、受信されたデータユニットに含まれるシーケンス番号)とResponderシーケンス番号48とが等しいか否かを通信制御部42に通知する。
【0056】
通信制御部42は、シーケンス番号判定部47によって、受信されたデータユニットに含まれるシーケンス番号とResponderシーケンス番号48とが等しいことが通知された場合、上述のように、シーケンス番号更新部43、データユニット生成部44及びデータユニット送信部45を介して、シーケンス番号更新部43によって更新(インクリメント)されたResponderシーケンス番号48とデータとを含むデータユニット、又は更新されたResponderシーケンス番号48を含むACKを外部デバイスに送信する。
【0057】
通信制御部42は、シーケンス番号判定部47によって、受信されたデータユニットに含まれるシーケンス番号とResponderシーケンス番号48とが等しくないことが通知された場合、Responderによって既に送信された、現在のResponderシーケンス番号48を含むデータユニットが、通信経路(伝送経路)の途中のバッファ等に存在することが想定されるので、ACK(データユニット)を送信しない。
【0058】
なお、通信制御部42は、送信したデータユニット又はACKの送信エラーを検出した場合、シーケンス番号更新部43に、Responderシーケンス番号48のデクリメントを要求する。シーケンス番号更新部43は、通信制御部42による要求に応じて、Responderシーケンス番号48から所定の値(例えば、1)を減算することによって、Responderシーケンス番号48を更新する。
【0059】
以上の構成により、Initiatorである電子機器10は、外部デバイス(Responder)に一つのデータユニットを送信した後、一つのデータユニットを外部デバイスから受信するまで、又は外部デバイスに一つのデータユニットを送信してから所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御される。つまり、Initiatorは、一つのデータユニットを送信した後、ResponderからデータユニットとACKのいずれか一方を受信することなく、連続してデータユニットを送信することはできないように制御される。また、Responderは、アプリケーションプログラムによってデータの送信が要求されたとき等、自由なタイミングでデータユニットを送信することができる。つまり、Initiatorにおいて、複数のデータユニットを連続して送信するような要求が生じていても、Responderである電子機器10は、割り込んでデータ(データユニット)を送信することができる。したがって、コネクション層(CNL)22では、ResponderよりもInitiatorによるデータ伝送が優先される非対称な通信が実行される構成であっても、通信制御プログラム109a,109b(シリアルアダプタ232)によって擬似的な全二重通信を実現することができる。
【0060】
図8は、電子機器10によって送受信されるデータユニットの一構成例を示す。
シリアルプロトコルデータ51は、アプリケーション層のポートエミュレータ242等によって送信が要求されたデータである。つまり、シリアルプロトコルデータ51は、送信待ちデータ39,49、又は送信待ちデータ39,49の内の一部のデータである。また、PCLシリアルプロトコルデータユニット(PCLシリアルPDU)52は、シリアルプロトコルデータ51であるPCLシリアルサービスデータユニット(PCLシリアルSDU)52bに、ヘッダ52aが付加されたデータユニットである。このヘッダ内に上述のシーケンス番号38,48が記述される。コネクション層(CNL)22では、PCLシリアルPDU52であるトランスポートブロック53が複数のCNLサービスユニット(CSDU)53aに分割され、送信される。
【0061】
また、図9及び図10は、PCLシリアルPDU52のフォーマットの例を示す。
PCLシリアルPDU52は、先頭から4バイト目までにヘッダ部分52aを含み、5バイト目以降に送受信対象のデータ部分52bを含む。データ部分52bに格納されるデータのサイズは、例えば、0バイトから65535バイトである。
【0062】
また、1バイト目(Byte 0)の先頭の3ビットには「接続番号」(例えば、0から7までのいずれかの値)が記述され、残りの5ビットには「データコマンド」(例えば、0x03)が記述される。2バイト目(Byte 1)には、擬似的な全二重通信を行うための「シーケンス番号」が記述される。「シーケンス番号」には、例えば0から255までのいずれかの値が記述される。したがって、「シーケンス番号」には、Initiatorによって送信されるデータユニットではInitiatorシーケンス番号38が記述され、Responderによって送信されるデータユニットではResponderシーケンス番号48が記述される。3バイト目から4バイト目まで(Byte 2及びByte 3)には、PCLシリアルSDU52bの「長さ」(すなわち、データ部分52bに格納されたデータの長さ)が記述される。「長さ」には、例えば0から65535までのいずれかの値が記述される。なお、「長さ」が0であるPCLシリアルPDU52は、ACKとして用いられる。
【0063】
図11は、プロトコル変換層シリアルサービスアクセスポイント(PCLシリアルSAP)232aを介して、ポートエミュレータ242とPCLシリアルアダプタ232との間で用いられるコマンドの例を示す。つまり、ポートエミュレータ242は、これらコマンドを用いてシリアルアダプタ232aを制御する。また、他のサービスアクセスポイント231a,22a等でも同様のコマンドが用いられる。
【0064】
“.request”は、下位層で実行されるサービスを要求するためのコマンドである。“.confirmation”は、サービスの要求に応答するためのコマンドである。“.indication”は、下位層から上位層への非同期のインジケーションのためのコマンドである。“.response”は、インジケーションに対して応答するためのコマンドである。また、コマンドの種類には、開始を示す“START”、停止を示す“STOP”、データ転送を示す“DATA”、ステータス転送を示す“STATUS”等が含まれる。
【0065】
より具体的には、例えば、“PCL_SERIAL_DATA.request”は、ポートエミュレータ242からPCLシリアルアダプタ232に対して、データを送信するサービスを要求するためのコマンドである。また、“PCL_SERIAL_DATA.indication”は、PCLシリアルアダプタ232からポートエミュレータ242に対して、データを受信したことを通知(インジケーション)するためのコマンドである。
【0066】
図12から図14は、電子機器10によって実行される階層的な通信シーケンスの例を示す。上述のように、電子機器10は、Initiator10aとResponder10bのどちらとしても機能し得る。なお、以下に説明する通信シーケンスが開始される際のInitiatorシーケンス番号38とResponderシーケンス番号48とはいずれも“x”であることを想定する。
【0067】
図12は、Initiator10aがResponder10bに一つのデータユニットを送信した後、Responder10bから一つのデータユニットを受信するまで、新たなデータユニットを送信することを待つ通信シーケンスの例を示す。
【0068】
まず、Initiator10aのポートエミュレータ242a(アプリケーション層24)は、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232a(プロトコル変換層23)に出力する(S201)。PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S202)。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S203)。
【0069】
なお、PCLシリアルアダプタ232aは、要求をコネクション層(CNL)22aに出力したことに応答して、タイマーによる計測を開始する。タイマーは、S202で要求が出力されてからの経過時間を計測する。そして、PCLシリアルアダプタ232aは、Responder10bへの一つのデータユニットの送信要求を出力してから、Responder10bからの一つのデータユニットのインジケーションを受け取るまで、又はタイマーによって計測された経過時間がしきい値時間を超えるまで、新たなデータユニットの送信(送信要求)を待つように制御する。すなわち、PCLシリアルアダプタ232aは、上記の条件に該当する期間内に、ポートエミュレータ242aによって新たなデータ送信要求が出力されても、コネクション層22aにデータユニットの送信要求が出力されないように制御する。
【0070】
Responder10bのコネクション層22bでは、Initiator10aのコネクション層22aによって送信されたCSDUが受信される。コネクション層22bでは、受信されたCSDUに含まれるInitiatorシーケンス番号38を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232bに出力される(S204)。
【0071】
次いで、シリアルアダプタ232bは、このインジケーションに含まれるInitiatorシーケンス番号38とResponderシーケンス番号48とが等しいかどうかを判定する。Initiatorシーケンス番号38とResponderシーケンス番号48とは、いずれも“x”であり等しい。そのため、シリアルアダプタ232bは、次にACK又はデータユニットを送信するとき、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“y”を設定する。そして、シリアルアダプタ232bは、Responderシーケンス番号48(=y)を含むデータユニットを送信するための要求(CNL_DATA.req)をコネクション層22bに出力する(S205)。なお、シリアルアダプタ232aは、送信待ちのデータがある場合、そのデータを含むデータユニットの送信を要求し、送信待ちのデータがない場合、ACK(すなわち、データを含まないデータユニット)の送信を要求する。コネクション層(CNL)22bでは、シリアルアダプタ232bによって出力されたデータユニットを用いて作成された、Responderシーケンス番号48を含むコネクション層サービスデータユニット(CSDU/ACK)が、Initiator10aに送信される(S206)。
【0072】
Initiator10aのコネクション層22aでは、Responder10bのコネクション層22bによって送信されたCSDUが受信される。コネクション層22aでは、受信されたCSDUに含まれるResponderシーケンス番号48を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232aに出力される(S207)。
【0073】
また、コネクション層22aからのインジケーションがシリアルアダプタ232aに出力される(S207)よりも前に、Initiator10aのポートエミュレータ242は、データ等をResponderに送信するための要求(PCLC_SERIAL_XXX.req)を出力している(S208)。しかし、上述のように、シリアルアダプタ232aは、一つのデータユニットをResponder10bに送信した後に、Responder10bからデータユニット(ACK)を受け取っておらず、且つタイマーによって計測された経過時間がしきい値時間を超えていないので、新たなデータユニットの送信要求をコネクション層22aに出力していない。シリアルアダプタ232aは、S207でコネクション層22aによって出力されたインジケーションに応じて(すなわち、Responder10bによって送信されたデータユニットの受信を待って)、インジケーションに含まれるResponderシーケンス番号48(=y)を用いて、Initiatorシーケンス番号38を更新することにより、Initiatorシーケンス番号38に“y”を設定する。これにより、シリアルアダプタ232aは、データユニットの送信を再開可能になる。
【0074】
そして、シリアルアダプタ232aは、更新されたInitiatorシーケンス番号38とデータとを含むデータユニットの送信要求(CNL_DATA.req)をコネクション層22aに出力する(S209)。このデータユニットの送信要求は、S208でのポートエミュレータ242による送信要求(PCLC_SERIAL_XXX.req)に対応する要求である。つまり、シリアルアダプタ232aは、一つのデータユニットをResponder10bに送信した後、一つのデータユニットをResponder10bから受信するまで、新たなデータユニットを送信しないように制御している。
【0075】
そして、コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38(=y)を含むCSDUが、Responder10bに送信される(S210)。
【0076】
次いで、図13は、Initiator10aがResponder10bに一つのデータユニットを送信した後、Responder10bから一つのデータユニットを受信するまで、新たなデータユニットを送信することを待つ通信シーケンスの別の例を示す。
【0077】
まず、Initiator10aのポートエミュレータ242a(アプリケーション層24)は、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232a(プロトコル変換層23)に出力する(S301)。PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S302)。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S303)。
【0078】
なお、PCLシリアルアダプタ232aは、要求をコネクション層(CNL)22aに出力したことに応答して、タイマー(タイムアウト検出部35)による計測を開始する。タイマーは、S302で要求が出力されてからの経過時間を計測する。そして、PCLシリアルアダプタ232aは、Responder10bへの一つのデータユニットの送信要求を出力してから、Responder10bからの一つのデータユニットのインジケーションを受け取るまで、又はタイマーによって計測された経過時間がしきい値時間を超えるまで、新たなデータユニットの送信(送信要求)を待つように制御する。すなわち、PCLシリアルアダプタ232aは、上記の条件に該当する期間中、ポートエミュレータ242aによって新たなデータ送信要求が出力されても、コネクション層22aにデータユニットの送信要求が出力されないように制御する。
【0079】
Responder10bのコネクション層22bでは、Initiator10aのコネクション層22aによって送信されたCSDUが受信される。コネクション層22bでは、受信されたCSDUに含まれるInitiatorシーケンス番号38を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232bに出力される(S304)。
【0080】
また、Responder10bのコネクション層22bが、Initiator10aのコネクション層22aによって送信されたCSDUを受信するよりも前に、Responder10bのポートエミュレータ242b(アプリケーション層24)は、データやステータス等をInitiator10aに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232b(プロトコル変換層23)に出力する(S305)。PCLシリアルアダプタ232bは、この要求に応じて、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“y”を設定する。そして、PCLシリアルアダプタ232bは、Responderシーケンス番号48(=y)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22bに出力する(S306)。コネクション層(CNL)22bでは、PCLシリアルアダプタ232bによって出力されたデータユニットを用いて作成された、Responderシーケンス番号48を含むコネクション層サービスデータユニット(CSDU)が、Initiator10aに送信される(S307)。
【0081】
Initiator10aのコネクション層22aでは、Responder10bのコネクション層22bによって送信されたCSDUが受信される。コネクション層22aでは、受信されたCSDUに含まれるResponderシーケンス番号48を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232aに出力される(S308)。シリアルアダプタ232aは、このインジケーションに応じて、インジケーションに含まれるResponderシーケンス番号48(=y)を用いて、Initiatorシーケンス番号38を更新することにより、Initiatorシーケンス番号38に“y”を設定する。
【0082】
Initiatorシーケンス番号38が更新された後に、Initiator10aのポートエミュレータ242aが、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232aに出力したとき(S309)、PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=y)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S310)。すなわち、PCLシリアルアダプタ232aは、S302で一つのデータユニットをResponder10bに送信した後に、S308でResponder10bから一つのデータユニットを受信しており、データユニットの送信が可能であるので、次のデータユニットを送信するための要求をコネクション層(CNL)22aに出力する。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S311)。
【0083】
一方、Responder10bのシリアルアダプタ232bは、S304で、Initiatorシーケンス番号38(=x)を含むインジケーション(CNL_DATA.ind)を受け取ったことに応じて、このInitiatorシーケンス番号38とResponderシーケンス番号48とが等しいかどうかを判定する。そして、Initiatorシーケンス番号38(=x)とResponderシーケンス番号48(=y)とが等しくないので、シリアルアダプタ232bは、Initiator10aにACK(データユニット)を送信しない。つまり、シリアルアダプタ232bは、Initiatorシーケンス番号38とResponderシーケンス番号48とに基づいて、ACKを送信する必要がないことを検出することができる。これにより、Initiator10aによって送信されるデータユニットを受信したことに応じて、毎回ACKを返すような、不要なトラフィックを削減することができる。
【0084】
また、図14は、Initiator10aがResponder10bに一つのデータユニットを送信した後、タイムアウトを検出するまで、新たなデータユニットを送信することを待つ通信シーケンスの例を示す。
【0085】
まず、Initiator10aのポートエミュレータ242a(アプリケーション層24)は、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232a(プロトコル変換層23)に出力する(S401)。PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S402)。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S403)。
【0086】
なお、PCLシリアルアダプタ232aは、要求をコネクション層(CNL)22aに出力したことに応答して、タイマーによる計測を開始する。タイマーは、S402で要求が出力されてからの経過時間を計測する。そして、PCLシリアルアダプタ232aは、Responder10bへの一つのデータユニットの送信要求を出力してから、Responder10bからの一つのデータユニットのインジケーションを受け取るまで、又はタイマーによって計測された経過時間がしきい値時間を超えるまで、新たなデータユニットの送信(送信要求)を待つように制御する。すなわち、PCLシリアルアダプタ232aは、上記の条件に該当する期間中、ポートエミュレータ242aによって新たなデータ送信要求が出力されても、コネクション層22aにデータユニットの送信要求が出力されないように制御する。
【0087】
また、S402で送信要求が出力されてからの経過時間がしきい値時間を超えるよりも前に、ポートエミュレータ242aが、データ等をResponderに送信するための要求(PCLC_SERIAL_XXX.req)を出力したとき(S405)、シリアルアダプタ232aは、新たなデータユニットの送信要求をコネクション層22aに出力しない。そして、S402で送信要求が出力されてからの経過時間がしきい値時間を超えた場合(すなわち、タイムアウトを検出した場合)、シリアルアダプタ232aは、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットの送信要求(CNL_DATA.req)をコネクション層22aに出力する(S406)。そして、コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38(=y)を含むCSDUが、Responder10bに送信される(S407)。これにより、例えば、Responder10bによって送信されるACKが、通信エラー等の不測の事態によってInitiator10aに届かなかったような場合でも、タイムアウトを検出することで通信(データ送信)を再開することができる。
【0088】
また、図15から図21は、電子機器10によって実行される通信シーケンスの種々のパターンの例を示す。上述のように、電子機器10は、Initiator10aとResponder10bのどちらとしても機能し得る。なお、以下に説明する通信シーケンスが開始される際のInitiatorシーケンス番号38とResponderシーケンス番号48とはいずれも“0”であることを想定する。
【0089】
図15は、Initiator10aのみデータを送信する通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S501)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、送信待ちデータ49がないとき、シーケンス番号“1”を含むACKをInitiator10aに送信する(S502)。これにより、Initiator10aにデータ送信の再開が促される。
【0090】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S503)。また、S504からS508において、S502及びS503と同様の通信シーケンスが繰り返される。
【0091】
図16は、Responder10bのみデータを送信する通信シーケンスの例を示す。
まず、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、データとシーケンス番号“1”とを含むデータユニットをInitiator10aに送信する(S511)。
【0092】
次いで、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、データとシーケンス番号“2”とを含むデータユニットをInitiator10aに送信する(S512)。また、S513からS514において、同様の通信シーケンスが繰り返される。
【0093】
図17は、Initiator10aとResponder10bの双方がデータを送信する通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S521)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”とデータとを含むデータユニットをInitiator10aに送信する(S522)。
【0094】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S523)。また、S524からS525において、S522及びS523と同様の通信シーケンスが繰り返される。
【0095】
図18は、Initiator10aがデータを連続して送信している間に、Responder10bが割り込んでデータを送信する通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S531)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”を含むACKをInitiator10aに送信する(S532)。
【0096】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S533)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、シーケンス番号“2”を含むACKをInitiator10aに送信する(S534)。
【0097】
次いで、Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。そして、Initiator10aは、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S535)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、シーケンス番号“3”とデータとを含むデータユニットをInitiator10aに送信する(S536)。また、S537からS538において、S533及びS534と同様の通信シーケンスが繰り返される。上述の通信シーケンスのように、Responder10bは、Initiator10aによる連続したデータ送信の間に、データ送信を行うことができる。
【0098】
図19は、Responder10bがデータを連続して送信している間に、Initiator10aが割り込んでデータを送信する通信シーケンスの例を示す。
まず、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、データとシーケンス番号“1”とを含むデータユニットをInitiator10aに送信する(S541)。Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。
【0099】
そして、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、データとシーケンス番号“2”とを含むデータユニットをInitiator10aに送信する(S542)。Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。
【0100】
次いで、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、データとシーケンス番号“3”とを含むデータユニットをInitiator10aに送信する(S543)
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“3”を設定する。そして、Initiator10aは、シーケンス番号“3”とデータとを含むデータユニットをResponder10bに送信する(S544)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“4”を設定する。そして、Responder10bは、シーケンス番号“4”とデータとを含むデータユニットをInitiator10aに送信する(S545)。上述の通信シーケンスのように、Initiator10aは、必要なときにいつでも、Responder10bによるデータ送信に割り込むことができるので、Responder10bは、Initiator10aの状態を考慮することなく、データ送信を行うことができる。
【0101】
図20は、Initiator10aが送信したデータユニットに対応する、Responder10bからのACKがタイムアウトする通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S551)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”を含むACKをInitiator10aに送信する(S552)。
【0102】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S553)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、シーケンス番号“2”を含むACKをInitiator10aに送信する(S554)。
【0103】
次いで、Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。そして、Initiator10aは、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S555)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。Responder10bは、シーケンス番号“3”を含むACKをInitiator10aに送信する(S556)。そして、ACKの送信が通信エラー等によって完了できなかった場合、Responder10bは、その通信エラーを検出したことに応答して、Responderシーケンス番号48をデクリメントすることによって、Responderシーケンス番号48に“2”を設定する。
【0104】
また、Initiator10aは、S555でデータユニットを送信してから所定時間が経過した場合、Responder10bによって送信される一つのデータユニット(又はACK)を待つことを中断(タイムアウト)し、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S557)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、シーケンス番号“3”を含むACKをInitiator10aに送信する(S558)。
【0105】
以上の通信シーケンスにより、Responder10bからの通信が不測の事態によって途絶えてしまった場合にも、Initiator10aはタイムアウトを検出することで、自身の通信を再開することができる。
【0106】
図21は、データユニットの送信に遅延がある通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S561)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”を含むACKをInitiator10aに送信する(S562)。
【0107】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S563)。
【0108】
また、Responder10bは、S563でInitiator10aから送信されたデータユニットを受信するよりも前に、Responderシーケンス番号48をインクリメントして“2”を設定し、シーケンス番号“2”とデータとを含むデータユニットをInitiator10aに送信する(S564)。
【0109】
そして、Responder10bは、S563でInitiator10aから送信されたデータユニットを受信したとき、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しくないので、Responderシーケンス番号48をインクリメントせず、またInitiator10aに対してACKを送信しない。
【0110】
一方、Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。そして、Initiator10aは、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S565)。
【0111】
Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、シーケンス番号“3”を含むACKをInitiator10aに送信する(S566)。上述の通信シーケンスにより、データユニットが通信経路内でバッファリングされることにより、データユニットの伝送に遅延が生じても、Responder10bからInitiator10aに不要なACKを送ることなく(S563,S564等参照)、擬似的な全二重通信を実行することができる。
【0112】
図15から図21に示すいずれの通信シーケンスでも、Initiator10aが一つのデータユニットを送信した後、Responder10bから一つのACKを受信するまで、又はInitiator10aが一つのデータユニットを送信した後、所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御されることにより、Initiator10aとResponder10bとの間で擬似的な全二重通信を実現することができる。
【0113】
次いで、図22に示すフローチャートを参照して、電子機器10によって実行される通信制御処理の手順について説明する。ここでは、電子機器10がInitiatorとして動作し、Responderとして動作する外部デバイスとの間で通信を実行することを想定する。また、電子機器10と外部デバイスとの間で、シリアルプロトコルに基づくデータ伝送サービスが実行されることを想定する。
【0114】
まず、近接無線通信デバイス104は、外部デバイスが近接状態であるか否かを判定する(ブロックB101)。外部デバイスが近接状態でない場合(ブロックB101のNO)、ブロックB101に戻り、外部デバイスが近接状態であるか否かが再度判定される。
【0115】
外部デバイスが近接状態である場合(ブロックB101のYES)、近接無線通信デバイス104は、外部デバイスとの接続(CNL接続)を確立する(ブロックB102)。そして、PCLコントローラ231は、外部デバイスのPCLコントローラとの間でネゴシエーションを実行することによって、PCLシリアルアダプタ232を選択する(ブロックB103)。
【0116】
次いで、初期化部31は、Initiatorシーケンス番号38に0を設定する(ブロックB104)。そして、通信制御部32は、送信待ちのデータ39があるか否か(ポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する(ブロックB105)。送信待ちのデータ39がある場合(ブロックB105のYES)、データユニット生成部33は、送信待ちデータ39とInitiatorシーケンス番号38とを含むデータユニットを生成する(ブロックB106)。そして、データユニット送信部34は、生成されたデータユニットを外部デバイスに送信する(ブロックB107)。
【0117】
次いで、データユニット受信部36は、データユニットを外部デバイスから受信したか否かを判定する(ブロックB108)。外部デバイスからデータユニットを受信している場合(ブロックB108のYES)、データユニット受信部36は、受信したデータユニットに含まれるResponderシーケンス番号を読み出す(ブロックB109)。そして、シーケンス番号更新部37は、メモリ13等に格納されているInitiatorシーケンス番号38の値を、読み出されたResponderシーケンス番号の値で更新する(ブロックB110)。また、データユニット受信部46は、受信したデータユニットに含まれるデータ(受信データ)を読み出す(ブロックB111)。そして、通信制御部32は、ポートエミュレータ242等を介してアプリケーションプログラムに受信データを出力し(ブロックB112)、ブロックB105に戻る。
【0118】
また、外部デバイスからデータユニットを受信していない場合(ブロックB108のNO)、タイムアウト検出部35は、ブロックB107でデータユニットを送信してからの経過時間がしきい値時間を超えるか否かを判定する(ブロックB113)。データユニットを送信してからの経過時間がしきい値時間を超えるとき(ブロックB113のYES)、タイムアウトと判定され、ブロックB105に戻る。したがって、送信待ちデータ39がある場合には、現在設定されているInitiatorシーケンス番号38を含む新たなデータユニットが送信される。
【0119】
データユニットを送信してからの経過時間がしきい値時間以下であるとき(ブロックB113のNO)、通信制御部32は、外部デバイスとの近接状態が解除されているか否か、すなわち、外部デバイスとの接続が解除されているか否かを判定する(ブロックB114)。外部デバイスとの接続が解除されているとき(ブロックB114のYES)、処理を終了する。外部デバイスとの接続が解除されていないとき(ブロックB114のNO)、ブロックB108に戻り、外部デバイスによって送信されるデータユニットが受信されたか否かが再度判定される。
【0120】
また、ブロックB105で送信待ちのデータ39があるか否かを判定したときに、送信待ちのデータ39がない場合(ブロックB105のNO)、データユニット受信部46は、外部デバイスによって送信されたデータユニットを受信したか否かを判定する(ブロックB115)。外部デバイスによって送信されたデータユニットを受信していない場合(ブロックB115のNO)、ブロックB105に戻る。また、外部デバイスによって送信されたデータユニットを受信している場合(ブロックB115のYES)、データユニット受信部36は、受信したデータユニットに含まれるResponderシーケンス番号を読み出す(ブロックB109)。そして、シーケンス番号更新部37は、メモリ13等に格納されているInitiatorシーケンス番号38の値を、読み出されたResponderシーケンス番号の値で更新する(ブロックB110)。また、データユニット受信部46は、受信したデータユニットに含まれるデータ(受信データ)を読み出す(ブロックB111)。そして、通信制御部32は、ポートエミュレータ242等を介してアプリケーションプログラムに受信データを出力し(ブロックB112)、ブロックB105に戻る。
【0121】
上述のシーケンス番号を用いた通信制御処理により、Initiator10aである電子機器10は、外部デバイス(Responder10b)に一つのデータユニットを送信した後、一つのデータユニットを外部デバイスから受信するまで、又は外部デバイスに一つのデータユニットを送信してから所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御される。なお、電子機器10は、電子機器10から外部デバイスにデータユニットを送信することなく、外部デバイスから1以上のデータユニットを受信し得る。
【0122】
また、図23のフローチャートを参照して、電子機器10によって実行される通信制御処理の手順について説明する。ここでは、電子機器10がResponderとして動作し、Initiatorとして動作する外部デバイスとの間で通信を実行することを想定する。また、電子機器10と外部デバイスとの間で、シリアルプロトコルに基づくデータ伝送サービスが実行されることを想定する。
【0123】
まず、近接無線通信デバイス104は、外部デバイスが近接状態であるか否かを判定する(ブロックB201)。外部デバイスが近接状態でない場合(ブロックB201のNO)、ブロックB201に戻り、外部デバイスが近接状態であるか否かが再度判定される。
【0124】
外部デバイスが近接状態である場合(ブロックB201のYES)、近接無線通信デバイス104は、外部デバイスとの接続(CNL接続)を確立する(ブロックB202)。そして、PCLコントローラ231は、外部デバイスのPCLコントローラとの間でネゴシエーションを実行することによって、PCLシリアルアダプタ232を選択する(ブロックB203)。
【0125】
次いで、初期化部41は、Responderシーケンス番号48に0を設定する(ブロックB204)。そして、データユニット受信部46は、外部デバイスからデータユニットを受信したか否かを判定する(ブロックB205)。外部デバイスからデータユニットを受信している場合(ブロックB205のYES)、データユニット受信部46は、受信したデータユニットに含まれるInitiatorシーケンス番号を読み出す(ブロックB206)。また、データユニット受信部46は、受信したデータユニットに含まれるデータを読み出す(ブロックB207)。そして、通信制御部42は、ポートエミュレータ242等を介してアプリケーションプログラムに受信データを出力する(ブロックB208)。
【0126】
次いで、シーケンス番号判定部47は、読み出したInitiatorシーケンス番号と、メモリ103等に格納されたResponderシーケンス番号48とが等しいか否かを判定する(ブロックB209)。Initiatorシーケンス番号とResponderシーケンス番号48とが等しくない場合(ブロックB209のNO)、ブロックB105に戻る。
【0127】
一方、Initiatorシーケンス番号とResponderシーケンス番号48とが等しい場合(ブロックB209のYES)、通信制御部42は、送信待ちのデータ49があるか否か(ポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する(ブロックB210)。
【0128】
送信待ちのデータ49がある場合(ブロックB210のYES)、シーケンス番号更新部43は、Responderシーケンス番号48をインクリメントすることによって更新する(ブロックB211)。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。データユニット生成部44は、送信待ちデータ49とResponderシーケンス番号48とを含むデータユニットを生成する(ブロックB212)。データユニット送信部45は、生成されたデータユニットを外部デバイスに送信する(ブロックB213)。
【0129】
一方、送信待ちのデータ49がない場合(ブロックB210のNO)、シーケンス番号更新部43は、Responderシーケンス番号48をインクリメントすることによって更新する(ブロックB214)。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。データユニット生成部44は、Responderシーケンス番号48を含むACKを生成する(ブロックB215)。このACKは、データを含まないデータユニットである。データユニット送信部45は、生成されたACKを外部デバイスに送信する(ブロックB216)。
【0130】
また、ブロックB205で外部デバイスによって送信されるデータユニットが受信されたか否かを判定したときに、データユニットが受信されていない場合(ブロックB205のNO)、通信制御部42は、送信待ちデータ49があるか否かを判定する(ブロックB218)。送信待ちデータ49がない場合(ブロックB218のNO)、ブロックB205に戻る。また、送信待ちデータ49がある場合(ブロックB218のYES)、シーケンス番号更新部43は、Responderシーケンス番号48をインクリメントすることによって更新する(ブロックB211)。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。データユニット生成部44は、送信待ちデータ49とResponderシーケンス番号48とを含むデータユニットを生成する(ブロックB212)。データユニット送信部45は、生成されたデータユニットを外部デバイスに送信する(ブロックB213)。
【0131】
ブロックB213でデータユニットを送信した後、又はブロックB216でACK(データを含まないデータユニット)を送信した後、通信制御部42は、外部デバイスとの近接状態が解除されているか否か、すなわち、外部デバイスとの接続が解除されているか否かを判定する(ブロックB217)。外部デバイスとの接続が解除されているとき(ブロックB217のYES)、処理を終了する。外部デバイスとの接続が解除されていないとき(ブロックB217のNO)、ブロックB205に戻り、外部デバイスによって送信されるデータユニットが受信されたか否かが再度判定される。
【0132】
上述のシーケンス番号を用いた通信制御処理により、Initiatorにおいて、複数のデータユニットを連続して送信するような要求が生じていても、Responderである電子機器10は、割り込んでデータ(データユニット)を送信することができる。
【0133】
以上説明したように、本実施形態によれば、非対称なデータ伝送を行うための伝送路で、擬似的に全二重通信を行うことができる。Initiator10aは、Responder10bに一つのデータユニットを送信した後、一つのデータユニットをResponder10bから受信するまで、又はResponder10bに一つのデータユニットを送信してから所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御される。これにより、Initiator10aにおいて、複数のデータユニットを連続して送信するような要求が生じていても、Responder10bは、割り込んでデータを送信することができる。したがって、コネクション層(CNL)22では、Responder10bよりもInitiator10aによるデータ伝送が優先される非対称な通信が実行される構成であっても、プロトコル変換層(PCL)23で通信制御プログラム109a,109b(シリアルアダプタ232)を実行することによって擬似的な全二重通信を実現することができる。
【0134】
なお、本実施形態の通信制御処理の手順は全てソフトウェアによって実行することができる。このため、通信制御処理の手順を実行するプログラムを格納したコンピュータ読み取り可能な記憶媒体を通じてこのプログラムを通常のコンピュータにインストールして実行するだけで、本実施形態と同様の効果を容易に実現することができる。
【0135】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0136】
109a…Initiator通信制御プログラム、109b…Responder通信制御プログラム、31…初期化部、32…通信制御部、33…データユニット生成部、34…データユニット送信部、35…タイムアウト検出部、36…データユニット受信部、37…シーケンス番号更新部、38…Initiatorシーケンス番号、39…送信待ちデータ、41…初期化部、42…通信制御部、43…シーケンス番号更新部、44…データユニット生成部、45…データユニット送信部、46…データユニット受信部、47…シーケンス番号判定部、48…Responderシーケンス番号、49…送信待ちデータ。
【技術分野】
【0001】
本発明の実施形態は、近接無線通信を実行する電子機器及び通信システムに関する。
【背景技術】
【0002】
近年、ICカード、携帯電話機等においては、NFCのような無線通信が利用され始めている。ユーザは、ICカード又は携帯電話をホスト装置のリーダ/ライタ部にかざすといった操作を行うだけで、認証、課金等のための通信を容易に行うことができる。
【0003】
また、最近では、デバイス間の高速なデータ伝送を可能にする新たな近接無線通信技術も開発され始めている。
【0004】
このようなデータ伝送では、例えば、一方のデバイスをマスタ(ソース)とし、他方のデバイスをスレーブ(シンク)とすることによって非対称なデータ伝送を行うことがある。非対称なデータ伝送では、一つ前のフレームに対応するデータ伝送が完了してから、次のフレームの送信が開始されるまでの待ち時間(フレーム間スペース)が、マスタとスレーブとで異なるように設定される。すなわち、マスタによるデータ送信を優先的に行うために、マスタの待ち時間がスレーブの待ち時間よりも短く設定される。これにより、マスタによるデータ送信が連続して要求されている間、マスタは途切れることなくデータを送信することができる。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2008−79045号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかし、マスタの待ち時間がスレーブの待ち時間よりも短く設定されるので、前のフレームの送信が完了した後、マスタとスレーブとが共にデータの送信を待っているとき、マスタによるデータ送信がスレーブによるデータ送信よりも常に先に要求される。つまり、マスタによるデータ送信が連続して要求されている間、スレーブが割り込んでデータを送信することはできない。したがって、ステータスの変更のような緊急度が高いデータを送信したい場合であっても、スレーブはデータを送信することができない可能性がある。
【0007】
本発明は、非対称なデータ伝送を行うための伝送路で、擬似的に全二重通信を行うことができる電子機器及び通信システムを提供することを目的とする。
【課題を解決するための手段】
【0008】
実施形態によれば、電子機器は、通信モジュール、シーケンス番号記憶手段、データユニット生成手段、データユニット送信手段、データユニット受信手段、及びシーケンス番号更新手段を具備する。通信モジュールは、外部デバイスとの通信を実行する。シーケンス番号記憶手段は、前記通信に用いられる第1シーケンス番号を格納する。データユニット生成手段は、データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成する。データユニット送信手段は、前記通信モジュールを用いて、前記外部デバイスに前記第1データユニットを送信する。データユニット受信手段は、前記通信モジュールを用いて、前記外部デバイスから第2シーケンス番号を含む第2データユニットを受信する。シーケンス番号更新手段は、前記第2シーケンス番号を用いて前記格納された第1シーケンス番号を更新する。データユニット送信手段は、前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記データユニット受信手段により前記第2データユニットが受信された後に、前記新たなデータと前記シーケンス番号更新手段により更新された第1シーケンス番号とを含む新たな第1データユニットを送信する。
【図面の簡単な説明】
【0009】
【図1】実施形態に係る電子機器の構成を示すブロック図。
【図2】同実施形態の電子機器と外部デバイスとの間で実行される近接無線通信の例を示す図。
【図3】同実施形態の電子機器に適用される、近接無線通信を制御するためのソフトウェアアーキテクチャの例を示す図。
【図4】同実施形態の電子機器に適用される、擬似的な全二重通信を制御するためのソフトウェアアーキテクチャの例を示す図。
【図5】近接無線通信での非対称な通信を説明するための概念図。
【図6】図5に示す非対称な通信による通信シーケンスの例を示す図。
【図7】同実施形態の電子機器によって実行される通信制御プログラムの機能構成の例を示すブロック図。
【図8】同実施形態の電子機器によって用いられるデータユニットを説明するための図。
【図9】同実施形態の電子機器によって用いられるデータユニットの構成の例を示す図。
【図10】同実施形態の電子機器によって用いられるデータユニットの構成の例を説明するための図。
【図11】同実施形態の電子機器によって用いられる、近接無線通信を制御するためのコマンドの例を示す図。
【図12】同実施形態の電子機器によって実行されるデータ通信の階層的な通信シーケンスの例を示す図。
【図13】同実施形態の電子機器によって実行されるデータ通信の階層的な通信シーケンスの別の例を示す図。
【図14】同実施形態の電子機器によって実行されるデータ通信の階層的な通信シーケンスのさらに別の例を示す図。
【図15】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第1の例を示す図。
【図16】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第2の例を示す図。
【図17】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第3の例を示す図。
【図18】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第4の例を示す図。
【図19】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第5の例を示す図。
【図20】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第6の例を示す図。
【図21】同実施形態の電子機器によって実行されるデータ通信の通信シーケンスの第7の例を示す図。
【図22】同実施形態の電子機器によって実行される通信制御処理の手順の例を示すフローチャート。
【図23】同実施形態の電子機器によって実行される通信制御処理の手順の別の例を示すフローチャート。
【発明を実施するための形態】
【0010】
以下、実施の形態について図面を参照して説明する。
図1は、本発明の一実施形態に係る電子機器の構成を示している。この電子機器は、例えば、携帯機器(例えば、携帯電話機、PDA、オーディオプレーヤ、補助記憶媒体等)、パーソナルコンピュータ、又はコンシューマ機器(例えば、TV、ビデオレコーダ等)として実現される。この電子機器は近接無線通信を実行する通信モジュールを備えており、近接無線通信機能を有する他のデバイス(外部デバイス)との無線接続を確立し、そして外部デバイスとの近接無線通信をピアツーピア形式で実行する。
【0011】
この電子機器10は、システム制御部101、ROM102、RAM103、近接無線通信デバイス104、電源制御部105、ACアダプタ106、バッテリ107、及び記憶装置108を備える。
【0012】
システム制御部101は、電子機器10内の各部の動作を制御する。システム制御部101は、CPU101aを備え、ROM102、RAM103、近接無線通信デバイス104、電源制御部105、及び記憶装置108に接続される。
【0013】
CPU101aは、ROM102に格納された命令群及びデータをRAM103へロードし、必要な処理を実行するプロセッサである。RAM103には、近接無線通信を制御するための通信制御プログラム109がロードされている。CPU101aは、RAM103にロードされた通信制御プログラム109を実行して、近接無線通信デバイス104を制御する。
【0014】
近接無線通信デバイス104は、近接無線通信を実行する通信モジュールである。近接無線通信デバイス104は、近接無線通信デバイス104から所定の距離内に存在する、近接無線通信機能を有する他のデバイス(外部デバイス)との無線接続を確立し、そしてファイルのようなデータの伝送を開始する。近接無線通信デバイス104と外部デバイスとの間の近接無線通信は、ピアツーピア形式で実行される。通信可能距離は例えば3cmである。近接無線通信デバイス104と外部デバイスとの間の無線接続は、近接無線通信デバイス104と外部デバイスとが近接状態である場合、つまり近接無線通信デバイス104と外部デバイスとの間の距離が通信可能距離(例えば3cm)以内に接近した場合に可能となる。近接無線通信デバイス104と外部デバイスとが通信可能距離以内に接近した時、近接無線通信デバイス104と外部デバイスとの間の無線接続が確立される。そして、例えば、外部デバイスは、記憶装置108内の所定の記憶領域へアクセスし、所定の記憶領域からのデータファイルの読み出しや、所定の記憶領域へのデータファイルの書き込み等によるデータの伝送が、近接無線通信デバイス104と外部デバイスとの間で実行される。
【0015】
近接無線通信においては、誘導電界が用いられる。近接無線通信方式としては、例えばTransferJetを使用し得る。TransferJetは、UWBを利用した近接無線通信方式であり、高速データ転送を実現することができる。
【0016】
近接無線通信デバイス104はアンテナ104aに接続されている。アンテナ104aはカプラと称される電極であり、誘導電界を用いた無線信号により、外部デバイスに対するデータの送受信を行う。外部デバイスがアンテナ104aから通信可能距離(例えば3cm)以内の範囲内に接近した場合、近接無線通信デバイス104及び外部デバイスそれぞれのアンテナ(カプラ)間が誘導電界によって結合され、これによって近接無線通信デバイス104と外部デバイスとの間の無線通信が実行可能となる。なお、近接無線通信デバイス104及びアンテナ104aは、一つのモジュールとして実現し得る。
【0017】
電源制御部105は、ACアダプタ106を介して外部から供給される電力、又はバッテリ107から供給される電力を用いて、電子機器10内の各部に電力を供給する。換言すれば、電子機器10は、AC商用電源のような外部電源、又はバッテリ107によって駆動される。ACアダプタ106は電子機器10内に設けることもできる。
【0018】
図2には、2つのデバイス間で実行される近接無線通信の様子が示されている。
ここでは、デバイスAが携帯電話から構成され、デバイスBがポータブルコンピュータから構成されている場合を想定する。ユーザは、例えば、デバイスAをデバイスBに近接させるという操作(タッチ操作)を行うことにより、デバイスA,B間のデータ転送を開始させることができる。デバイスA,B間のデータ転送は、デバイスA,Bが互いに近接したことをトリガに実行される。上述の電子機器10は、デバイスAとデバイスBのどちらとしても機能し得る。
【0019】
図3は、近接無線通信デバイス104を用いて実行される近接無線通信を制御するためのソフトウェアアーキテクチャを示す。
図3のソフトウェアアーキテクチャは近接無線通信を制御するためのプロトコルスタックの階層構造を示している。プロトコルスタックは、物理層(PHY)21、コネクション層(CNL)22、プロトコル変換層(PCL)23、アプリケーション層24から構成されている。例えば、コネクション層(CNL)22、プロトコル変換層(PCL)23、アプリケーション層24は通信制御プログラム109によって実現し得る。
【0020】
物理層(PHY)21は物理的なデータ転送を制御する層であり、OSI参照モデル内の物理層に対応する。物理層(PHY)21の一部の機能又は全ての機能は、近接無線通信デバイス104内のハードウェアを用いて実現することもできる。物理層(PHY)21は、コネクション層(CNL)22からのデータを無線信号に変換する。
【0021】
コネクション層(CNL)22は、OSI参照モデル内のデータリンク層及びトランスポート層に対応しており、近接状態に設定されている近接無線通信デバイス104と外部デバイスとの間の接続(CNL接続)を確立/解除し、データを伝送する処理を実行する。
【0022】
プロトコル変換層(PCL)23は、OSI参照モデル内のセッション層及びプレゼンテーション層に対応しており、アプリケーション層24と、デバイスA,B間の接続の確立及び解除を制御するためのコネクション層(CNL)22との間に位置する。プロトコル変換層(PCL)23は、アプリケーション層24内の各アプリケーション(通信プログラム)の管理と、セッション制御とを実行する。セッションは、電子機器10のアプリケーション層24と外部デバイスのアプリケーション層との間の通信路(伝送路)に相当する。
【0023】
より具体的には、プロトコル変換層(PCL)23は、アプリケーション層24の各通信プログラムが扱うアプリケーションプロトコル(ユーザプロトコルとも称する、例えば、SCSI、OBEX、他の汎用プロトコル等)に対応したデータ(ユーザデータ)を特定の伝送用データ形式に変換するための変換処理を実行する。この変換処理により、いずれの通信プログラムによって送受信されるデータであっても、コネクション層(CNL)22が扱うことが可能なパケット(特定の伝送用データ形式のデータ)に変換することができる。このプロトコル変換層(PCL)23は、さまざまなアプリケーションプロトコルを近接無線通信で利用することを可能にする。
【0024】
また、プロトコル変換層(PCL)23は、通信相手のデバイスとの間でサービス情報(各デバイスが提供可能なサービスを示す情報)及びセッション情報(確立/切断対象のセッションに関する情報)を交換する処理、さらに、アプリケーションの起動、コネクションの管理、及びセッションの管理等を行う。
【0025】
アプリケーション層24は、SCSI、OBEX、他の汎用プロトコル等の幾つかのアプリケーションプロトコルにそれぞれ対応した複数の通信プログラム(アプリケーション)を含んでいる。各アプリケーションは、プロトコル変換層(PCL)23に対してサービス(セッション)の開始/終了を要求する処理、及びプロトコル変換層(PCL)23を介してデータを送受信する処理を実行する。
【0026】
また、図4は、図3に示した階層と階層間の関係を実現するためのサービスアクセスポイント(SAP)との例を示す。サービスアクセスポイントは、隣接する階層間において、一方の階層から他方の階層に要求や応答等のコマンドを伝えるためのインタフェースである。物理層サービスアクセスポイント(PHY SAP)21aは、物理層21とコネクション層(CNL)22との間のインタフェースである。コネクション層サービスアクセスポイント(CNL SAP)22aは、コネクション層(CNL)22とプロトコル変換層(PCL)23との間のインタフェースである。
【0027】
また、プロトコル変換層(PCL)23は、プロトコル変換層コントローラ(PCLコントローラ)231とプロトコル変換層シリアルアダプタ(PCLシリアルアダプタ)232とを備える。PCLコントローラ231及びPCLシリアルアダプタ232は、コネクション層(CNL)22を介して、外部デバイスとの通信を行う。PCLコントローラ231は、アプリケーションマネージャ241に対して、接続の確立や解除、認証等の共通のサービスを提供する。PCLシリアルアダプタ232は、シリアルプロトコル(EIA/TIA−232−E)に対応するデータを、コネクション層(CNL)22が扱うことが可能なパケットに変換することができるPCLアダプタである。PCLシリアルアダプタ232は、PCLコントローラ231によって接続が確立された後にデータを伝送する。なお、プロトコル変換層(PCL)23は、他のユーザプロトコル(例えば、OBEX、他の汎用プロトコル等)に対応するデータを、コネクション層(CNL)22が扱うことが可能なパケットに変換することができる複数のPCLアダプタを備えてもよい。その場合、複数のPCLアダプタの内、PCLコントローラ231によって選択された一つのPCLアダプタが起動される。
【0028】
アプリケーション層24は、アプリケーションマネージャ241とポートエミュレータ242とを備える。アプリケーションマネージャ241は、通信を要求する各種のアプリケーションプログラムを管理し、通信に用いられるプロトコルに応じて、PCLコントローラサービスアクセスポイント231aを介してPCLコントローラ231を制御する。ポートエミュレータ242は、シリアルプロトコルによる通信をエミュレートするためのプログラムである。ポートエミュレータ242は、各種のアプリケーションプログラムによって、シリアルプロトコルに基づくデータ伝送サービスが実行されるとき、データの送受信等に応じたコマンドを生成する。そして、ポートエミュレータ242は、PCLシリアルサービスアクセスポイント232aを介して、PCLシリアルアダプタ232に対してコマンドを出力する。
【0029】
PCLコントローラ231は、アプリケーションマネージャ241による制御の下、PCLコントローラ231と外部デバイスのPCLコントローラとの間で、起動するアダプタのネゴシエーションを実行する。ここで、シリアルアダプタが選択された場合、PCLシリアルアダプタ232が起動される。PCLシリアルアダプタ232は、ポートエミュレータ242によって出力されたコマンドに応じて、外部デバイスとのシリアルプロトコルによる通信を実行する。
【0030】
なお、コネクション層(CNL)22では、外部デバイスにサービスの開始を要求するデバイス(以下、Initiatorと称する)をマスタとし、外部デバイスから送信されるサービスの開始要求を受信するデバイス(以下、Responderと称する)をスレーブとして通信(サービス)が実行される。Initiatorは、通信相手のデバイスを制御してデバイス間のデータ転送のようなサービスを実行する。Responderは、通信相手のデバイスの制御の下、デバイス間のデータ転送のようなサービスを実行する。上述の電子機器10は、InitiatorとResponderのどちらとしても機能し得る。コネクション層(CNL)22では、Initiatorによって送信されるデータ(データユニット)の優先度が、Responderによって送信されるデータ(データユニット)の優先度よりも高く設定され、非対称な通信が実行される。
【0031】
図5を参照して、この非対称な通信が実行される際に、InitiatorとResponderとによって送信されるデータユニットの例について説明する。図5に示す例では、Initiatorによって送信されるデータユニットの優先度を、Responderによって送信されるデータユニットの優先度よりも高く設定するために、一つ前のフレーム(コマンド)の処理が完了してからのInitiatorの通信待ち時間(IIFSとも称する、例えば8.5マイクロ秒)が、Responderの通信待ち時間(RIFSとも称する、例えば15.7マイクロ秒)よりも短く設定されている。InitiatorとResponderの双方が通信を要求する場合、InitiatorがIIFSだけ待って通信を要求し、ResponderがRIFSだけ待って通信を要求するので、常にInitiator側の通信が先行して実行される。そのため、図6のように、Initiator側が大量のデータを送信する場合、Initiatorが一連の送信シーケンス(S11〜S16)を完了するまで、Responderはデータを送信すること(S17)ができない。例えば、Responderは、ステータスの変更などの緊急度が高いデータを送信したいときであっても、Initiatorによるデータ送信が途切れるまで、データ送信を開始する(割り込む)ことができない。
【0032】
プロトコル変換層(PCL)23のPCLシリアルアダプタ232は、アプリケーション層24で、シリアルプロトコルのような全二重通信を実行するプロトコルを用いたプログラム(すなわち、上述のポートエミュレータ242を用いたプログラム)を実行するために、擬似的な全二重通信(Pseudo Full Duplex Emulation)を実行するための機能を有する。つまり、PCLシリアルアダプタ232は、Initiatorによってデータが送信されている途中であっても、Responderが待たされることなく割り込んでデータを送信できる機能を実現する。
【0033】
図7は、擬似的な全二重通信を実行するための通信制御プログラム109の機能構成の例を示す。すなわち、通信制御プログラム109はPCLシリアルアダプタ232の動作を実現するプログラムである。図7の例では、Initiatorとして動作するための通信制御プログラム109aの構成と、Responderとして動作するための通信制御プログラム109bの構成とを示すが、1つの通信制御プログラム109が通信制御プログラム109aの構成と通信制御プログラム109bの構成とを備えてもよい。すなわち、電子機器10がInitiatorとして動作するとき、通信制御プログラム109aの構成によって通信処理が実行され、電子機器10がResponderとして動作するとき、通信制御プログラム109bの構成によって通信処理が実行される。
【0034】
ここで、Initiatorとして動作する第1デバイスとResponderとして動作する第2デバイスとは、近接状態にあり、第1デバイスに設けられた近接無線通信デバイスと第2デバイスに設けられた近接無線通信デバイスとの間で接続(CNL接続)が確立されていることを想定する。図5及び図6を参照して説明したように、コネクション層(CNL)22での第1デバイス(Initiator)のデータ伝送は、第2デバイス(Responder)のデータ伝送よりも優先して実行される。また、接続開始時のネゴシエーションによって、PCLコントローラ231によってPCLシリアルアダプタ232が選択されたこと(すなわち、通信プロトコルとしてシリアルプロトコルが選択されたこと)を想定する。したがって、第1デバイスでは通信制御プログラム109aが実行され、第2デバイスでは通信制御プログラム109bが実行される。
【0035】
第1デバイス(Initiator)上で実行される通信制御プログラム109aは、一つのデータユニットを第2デバイス(Responder)に送信した後、Responderから一つのデータユニットを受信するまで、次のデータユニットの送信を待つように通信を制御する。つまり、Responderから一つのデータユニットを受信した後に、新たに一つのデータユニットを送信することができる。通信制御プログラム109aは、初期化部31、通信制御部32、データユニット生成部33、データユニット送信部34、タイムアウト検出部35、データユニット受信部36、シーケンス番号更新部37等を備える。
【0036】
初期化部31は、PCLコントローラ231によってPCLシリアルアダプタ232が選択(起動)されたとき、初期化処理を実行する。初期化部31は、例えば、Initiatorシーケンス番号38を初期化する、すなわち、Initiatorシーケンス番号38に0を設定する。Initiatorシーケンス番号38は、InitiatorとResponderとの間のデータ伝送を制御するために用いられる。Initiatorシーケンス番号38は、例えば、メモリ103内の領域に格納される。初期化部31は、初期化が完了したことを通信制御部32に通知する。
【0037】
通信制御部32は、送信待ちのデータ39があるか否か(又はポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する。通信制御部32は、送信待ちのデータ39がある場合、データユニット生成部33にデータユニットの生成を要求する。なお、送信待ちデータ39は、例えば、メモリ103内の領域に格納されている。送信待ちデータ39は、ポートエミュレータ242によって出力される送信要求コマンドに指定された、送信対象のデータである。データがデータユニットのペイロードとして送信された後、当該データはメモリ103から削除される。データのサイズが、一つのデータユニットのペイロードとして送信できるサイズよりも大きい際には、そのサイズに応じて分割して送信されるので、送信が完了したデータ部分がメモリ103から削除される。
【0038】
データユニット生成部33は、通信制御部32による要求に応じて、送信待ちデータ39とInitiatorシーケンス番号(第1シーケンス番号とも称する)38とを含むデータユニット(第1データユニットとも称する)を生成する。なお、Initiatorシーケンス番号38は、例えば、データユニット内のヘッダ部分に記述される。データユニット生成部33は、生成したデータユニットをデータユニット送信部34に出力する。
【0039】
データユニット送信部34は、データユニット生成部33によって出力されたデータユニットを外部デバイス(外部デバイスのデータユニット受信部46)に送信する。データユニット送信部34は、データユニットを送信したことをタイムアウト検出部35に通知する。
【0040】
タイムアウト検出部35は、データユニットが送信されてからの経過時間を計測する。そして、タイムアウト検出部35は、計測した時間がしきい値時間(例えば、1ミリ秒)を超えたか否か、すなわち、タイムアウトを検出する。タイムアウト検出部35は、タイムアウトが検出されたことを通信制御部32に通知する。
【0041】
また、データユニット受信部36は、外部デバイスによって送信されたデータユニットを受信する。外部デバイスからデータユニットを受信した場合、データユニット受信部36は、受信したデータユニットに含まれるシーケンス番号(第2シーケンス番号とも称する)を読み出す。そして、データユニット受信部36は、読み出したシーケンス番号をシーケンス番号更新部37に出力する。また、データユニット受信部36は、受信したデータユニットに含まれるデータ(受信データ)を読み出す。そして、データユニット受信部36は、読み出した受信データを通信制御部32に出力する。
【0042】
シーケンス番号更新部37は、データユニット受信部36によって出力されたシーケンス番号を用いて、メモリ13等に格納されているInitiatorシーケンス番号38を更新する。つまり、Initiatorシーケンス番号38に、受信したデータユニットに含まれるシーケンス番号が設定される。
【0043】
通信制御部32は、データユニット受信部36によって出力された受信データを、ポートエミュレータ242等を介して所定のアプリケーションプログラムに出力する。アプリケーションプログラムは、受信データを用いて所定の処理(例えば、データのバックアップ処理等)を実行する。なお、通信制御部32は、メモリ103内の所定の領域に受信データを格納することによって、アプリケーションプログラムに受信データを渡してもよい。
【0044】
また、通信制御部32は、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信した後、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信するまで、新たなデータユニットが外部デバイスに送信されることを待つように、通信制御プログラム109a内の各部を制御する。つまり、通信制御部32は、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信した後に、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信したとき、新たなデータユニットの送信を許可する。又は、通信制御部32は、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信した後、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信せずに、タイムアウト検出部35によってタイムアウトが検出されたとき(すなわち、データユニットを送信してからの経過時間がしきい値を超えたとき)、新たなデータユニットの送信を許可する。
【0045】
したがって、データユニット送信部34を介して外部デバイスに一つのデータユニットを送信し、データユニット受信部36を介して外部デバイスから一つのデータユニットを受信した後に、通信制御部32は、上述のようにデータユニット生成部33及びデータユニット送信部34を介して、シーケンス番号更新部37によって更新されたInitiatorシーケンス番号38とデータとを含む新たなデータユニットを外部デバイスに送信する。また、タイムアウト検出部35によってタイムアウトが検出された際には、通信制御部32は、上述のようにデータユニット生成部33及びデータユニット送信部34を介して、Initiatorシーケンス番号38(更新されていないInitiatorシーケンス番号38)とデータとを含む新たなデータユニットを外部デバイスに送信する。
【0046】
なお、タイムアウト検出部35は、データユニット送信部34によって一つデータユニットが送信されてからの経過時間を計測している間に、データユニット受信部36によって一つのデータユニットが受信された場合、経過時間の計測を終了してもよい。また、データユニット受信部36によって、データを含まないデータユニット(ACK)が受信され、且つデータユニット送信部34によって次に送信される新たなデータユニットがデータを含まない場合、タイムアウト検出部35は、データユニット送信部34によって一つデータユニットが送信されてからの経過時間を計測しなくてもよい、すなわち、タイムアウトを検出しなくてもよい。
【0047】
次いで、第2デバイス(Responder)上で実行される通信制御プログラム109bは、第1デバイス(Initiator)にデータユニットを送信することが要求されたとき、Responder内に格納されるResponderシーケンス番号48をインクリメントし、インクリメントされたResponderシーケンス番号48を含むデータユニットを送信するように通信を制御する。通信制御プログラム109bは、初期化部41、通信制御部42、シーケンス番号更新部43、データユニット生成部44、データユニット送信部45、データユニット受信部46、シーケンス番号判定部47等を備える。
【0048】
初期化部41は、PCLコントローラ231によってPCLシリアルアダプタ232が選択(起動)されたとき、初期化処理を実行する。初期化部41は、例えば、Responderシーケンス番号48を初期化する、すなわち、Responderシーケンス番号48に0を設定する。Responderシーケンス番号48は、InitiatorとResponderとの間のデータ伝送を制御するために用いられる。Responderシーケンス番号48は、例えば、メモリ103内の領域に格納される。初期化部41は、初期化が完了したことを通信制御部42に通知する。
【0049】
通信制御部42は、送信待ちのデータ49があるか否か(又はポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する。通信制御部42は、送信待ちのデータ49がある場合、シーケンス番号更新部43に、Responderシーケンス番号48の更新を要求する。なお、送信待ちデータ49は、例えば、メモリ103内の領域に格納されている。送信待ちデータ49は、ポートエミュレータ242によって出力される送信要求コマンドに指定された、送信対象のデータである。データがデータユニットのペイロードとして送信された後、当該データはメモリ103から削除される。データのサイズが、一つのデータユニットのペイロードとして送信できるサイズよりも大きい際には、そのサイズに応じて分割して送信されるので、送信が完了したデータ部分がメモリ103から削除される。
【0050】
シーケンス番号更新部43は、通信制御部42による要求に応じて、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48を更新する。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。そして、シーケンス番号更新部43は、Responderシーケンス番号48が更新されたことをデータユニット生成部44に通知する。
【0051】
データユニット生成部44は、シーケンス番号更新部43による要求に応じて、送信待ちデータ49があるか否かを判定する。そして、送信待ちデータ49がある場合、データユニット生成部44は、送信待ちデータ49と更新されたResponderシーケンス番号48とを含むデータユニット(第2データユニットとも称する)を生成する。また、送信待ちデータ49がない場合、データユニット生成部44は、Responderシーケンス番号48を含むACKを生成する。Responderシーケンス番号48を含むACKは、換言すると、データを含まないデータユニット(データ長0の第2データユニット)である。なお、Responderシーケンス番号48は、例えばデータユニット内のヘッダ部分に記述される。データユニット生成部44は、生成したデータユニット又はACKをデータユニット送信部45に出力する。
【0052】
データユニット送信部45は、データユニット生成部44によって出力されたデータユニットを外部デバイス(外部デバイスのデータユニット受信部36)に送信する。
【0053】
また、データユニット受信部46は、外部デバイスによって送信されたデータユニットを受信する。外部デバイスからデータユニットを受信した場合、データユニット受信部46は、受信したデータユニットに含まれるシーケンス番号(Initiatorシーケンス番号38)を読み出す。そして、データユニット受信部46は、読み出したシーケンス番号をシーケンス番号判定部47に出力する。また、データユニット受信部46は、受信したデータユニットに含まれるデータ(受信データ)を読み出す。そして、データユニット受信部46は、読み出した受信データを通信制御部42に出力する。
【0054】
通信制御部42は、データユニット受信部46によって出力された受信データを、ポートエミュレータ242等を介して所定のアプリケーションプログラムに出力する。アプリケーションプログラムは、受信データを用いて所定の処理(例えば、バックアップデータの更新処理等)を実行する。なお、通信制御部42は、メモリ103内の所定の領域に受信データを格納することによって、アプリケーションプログラムに受信データを渡してもよい。
【0055】
また、シーケンス番号判定部47は、データユニット受信部46によって出力されたシーケンス番号と、メモリ103等に格納されたResponderシーケンス番号48とが等しいか否かを判定する。シーケンス番号判定部47は、データユニット受信部46によって出力されたシーケンス番号(すなわち、受信されたデータユニットに含まれるシーケンス番号)とResponderシーケンス番号48とが等しいか否かを通信制御部42に通知する。
【0056】
通信制御部42は、シーケンス番号判定部47によって、受信されたデータユニットに含まれるシーケンス番号とResponderシーケンス番号48とが等しいことが通知された場合、上述のように、シーケンス番号更新部43、データユニット生成部44及びデータユニット送信部45を介して、シーケンス番号更新部43によって更新(インクリメント)されたResponderシーケンス番号48とデータとを含むデータユニット、又は更新されたResponderシーケンス番号48を含むACKを外部デバイスに送信する。
【0057】
通信制御部42は、シーケンス番号判定部47によって、受信されたデータユニットに含まれるシーケンス番号とResponderシーケンス番号48とが等しくないことが通知された場合、Responderによって既に送信された、現在のResponderシーケンス番号48を含むデータユニットが、通信経路(伝送経路)の途中のバッファ等に存在することが想定されるので、ACK(データユニット)を送信しない。
【0058】
なお、通信制御部42は、送信したデータユニット又はACKの送信エラーを検出した場合、シーケンス番号更新部43に、Responderシーケンス番号48のデクリメントを要求する。シーケンス番号更新部43は、通信制御部42による要求に応じて、Responderシーケンス番号48から所定の値(例えば、1)を減算することによって、Responderシーケンス番号48を更新する。
【0059】
以上の構成により、Initiatorである電子機器10は、外部デバイス(Responder)に一つのデータユニットを送信した後、一つのデータユニットを外部デバイスから受信するまで、又は外部デバイスに一つのデータユニットを送信してから所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御される。つまり、Initiatorは、一つのデータユニットを送信した後、ResponderからデータユニットとACKのいずれか一方を受信することなく、連続してデータユニットを送信することはできないように制御される。また、Responderは、アプリケーションプログラムによってデータの送信が要求されたとき等、自由なタイミングでデータユニットを送信することができる。つまり、Initiatorにおいて、複数のデータユニットを連続して送信するような要求が生じていても、Responderである電子機器10は、割り込んでデータ(データユニット)を送信することができる。したがって、コネクション層(CNL)22では、ResponderよりもInitiatorによるデータ伝送が優先される非対称な通信が実行される構成であっても、通信制御プログラム109a,109b(シリアルアダプタ232)によって擬似的な全二重通信を実現することができる。
【0060】
図8は、電子機器10によって送受信されるデータユニットの一構成例を示す。
シリアルプロトコルデータ51は、アプリケーション層のポートエミュレータ242等によって送信が要求されたデータである。つまり、シリアルプロトコルデータ51は、送信待ちデータ39,49、又は送信待ちデータ39,49の内の一部のデータである。また、PCLシリアルプロトコルデータユニット(PCLシリアルPDU)52は、シリアルプロトコルデータ51であるPCLシリアルサービスデータユニット(PCLシリアルSDU)52bに、ヘッダ52aが付加されたデータユニットである。このヘッダ内に上述のシーケンス番号38,48が記述される。コネクション層(CNL)22では、PCLシリアルPDU52であるトランスポートブロック53が複数のCNLサービスユニット(CSDU)53aに分割され、送信される。
【0061】
また、図9及び図10は、PCLシリアルPDU52のフォーマットの例を示す。
PCLシリアルPDU52は、先頭から4バイト目までにヘッダ部分52aを含み、5バイト目以降に送受信対象のデータ部分52bを含む。データ部分52bに格納されるデータのサイズは、例えば、0バイトから65535バイトである。
【0062】
また、1バイト目(Byte 0)の先頭の3ビットには「接続番号」(例えば、0から7までのいずれかの値)が記述され、残りの5ビットには「データコマンド」(例えば、0x03)が記述される。2バイト目(Byte 1)には、擬似的な全二重通信を行うための「シーケンス番号」が記述される。「シーケンス番号」には、例えば0から255までのいずれかの値が記述される。したがって、「シーケンス番号」には、Initiatorによって送信されるデータユニットではInitiatorシーケンス番号38が記述され、Responderによって送信されるデータユニットではResponderシーケンス番号48が記述される。3バイト目から4バイト目まで(Byte 2及びByte 3)には、PCLシリアルSDU52bの「長さ」(すなわち、データ部分52bに格納されたデータの長さ)が記述される。「長さ」には、例えば0から65535までのいずれかの値が記述される。なお、「長さ」が0であるPCLシリアルPDU52は、ACKとして用いられる。
【0063】
図11は、プロトコル変換層シリアルサービスアクセスポイント(PCLシリアルSAP)232aを介して、ポートエミュレータ242とPCLシリアルアダプタ232との間で用いられるコマンドの例を示す。つまり、ポートエミュレータ242は、これらコマンドを用いてシリアルアダプタ232aを制御する。また、他のサービスアクセスポイント231a,22a等でも同様のコマンドが用いられる。
【0064】
“.request”は、下位層で実行されるサービスを要求するためのコマンドである。“.confirmation”は、サービスの要求に応答するためのコマンドである。“.indication”は、下位層から上位層への非同期のインジケーションのためのコマンドである。“.response”は、インジケーションに対して応答するためのコマンドである。また、コマンドの種類には、開始を示す“START”、停止を示す“STOP”、データ転送を示す“DATA”、ステータス転送を示す“STATUS”等が含まれる。
【0065】
より具体的には、例えば、“PCL_SERIAL_DATA.request”は、ポートエミュレータ242からPCLシリアルアダプタ232に対して、データを送信するサービスを要求するためのコマンドである。また、“PCL_SERIAL_DATA.indication”は、PCLシリアルアダプタ232からポートエミュレータ242に対して、データを受信したことを通知(インジケーション)するためのコマンドである。
【0066】
図12から図14は、電子機器10によって実行される階層的な通信シーケンスの例を示す。上述のように、電子機器10は、Initiator10aとResponder10bのどちらとしても機能し得る。なお、以下に説明する通信シーケンスが開始される際のInitiatorシーケンス番号38とResponderシーケンス番号48とはいずれも“x”であることを想定する。
【0067】
図12は、Initiator10aがResponder10bに一つのデータユニットを送信した後、Responder10bから一つのデータユニットを受信するまで、新たなデータユニットを送信することを待つ通信シーケンスの例を示す。
【0068】
まず、Initiator10aのポートエミュレータ242a(アプリケーション層24)は、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232a(プロトコル変換層23)に出力する(S201)。PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S202)。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S203)。
【0069】
なお、PCLシリアルアダプタ232aは、要求をコネクション層(CNL)22aに出力したことに応答して、タイマーによる計測を開始する。タイマーは、S202で要求が出力されてからの経過時間を計測する。そして、PCLシリアルアダプタ232aは、Responder10bへの一つのデータユニットの送信要求を出力してから、Responder10bからの一つのデータユニットのインジケーションを受け取るまで、又はタイマーによって計測された経過時間がしきい値時間を超えるまで、新たなデータユニットの送信(送信要求)を待つように制御する。すなわち、PCLシリアルアダプタ232aは、上記の条件に該当する期間内に、ポートエミュレータ242aによって新たなデータ送信要求が出力されても、コネクション層22aにデータユニットの送信要求が出力されないように制御する。
【0070】
Responder10bのコネクション層22bでは、Initiator10aのコネクション層22aによって送信されたCSDUが受信される。コネクション層22bでは、受信されたCSDUに含まれるInitiatorシーケンス番号38を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232bに出力される(S204)。
【0071】
次いで、シリアルアダプタ232bは、このインジケーションに含まれるInitiatorシーケンス番号38とResponderシーケンス番号48とが等しいかどうかを判定する。Initiatorシーケンス番号38とResponderシーケンス番号48とは、いずれも“x”であり等しい。そのため、シリアルアダプタ232bは、次にACK又はデータユニットを送信するとき、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“y”を設定する。そして、シリアルアダプタ232bは、Responderシーケンス番号48(=y)を含むデータユニットを送信するための要求(CNL_DATA.req)をコネクション層22bに出力する(S205)。なお、シリアルアダプタ232aは、送信待ちのデータがある場合、そのデータを含むデータユニットの送信を要求し、送信待ちのデータがない場合、ACK(すなわち、データを含まないデータユニット)の送信を要求する。コネクション層(CNL)22bでは、シリアルアダプタ232bによって出力されたデータユニットを用いて作成された、Responderシーケンス番号48を含むコネクション層サービスデータユニット(CSDU/ACK)が、Initiator10aに送信される(S206)。
【0072】
Initiator10aのコネクション層22aでは、Responder10bのコネクション層22bによって送信されたCSDUが受信される。コネクション層22aでは、受信されたCSDUに含まれるResponderシーケンス番号48を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232aに出力される(S207)。
【0073】
また、コネクション層22aからのインジケーションがシリアルアダプタ232aに出力される(S207)よりも前に、Initiator10aのポートエミュレータ242は、データ等をResponderに送信するための要求(PCLC_SERIAL_XXX.req)を出力している(S208)。しかし、上述のように、シリアルアダプタ232aは、一つのデータユニットをResponder10bに送信した後に、Responder10bからデータユニット(ACK)を受け取っておらず、且つタイマーによって計測された経過時間がしきい値時間を超えていないので、新たなデータユニットの送信要求をコネクション層22aに出力していない。シリアルアダプタ232aは、S207でコネクション層22aによって出力されたインジケーションに応じて(すなわち、Responder10bによって送信されたデータユニットの受信を待って)、インジケーションに含まれるResponderシーケンス番号48(=y)を用いて、Initiatorシーケンス番号38を更新することにより、Initiatorシーケンス番号38に“y”を設定する。これにより、シリアルアダプタ232aは、データユニットの送信を再開可能になる。
【0074】
そして、シリアルアダプタ232aは、更新されたInitiatorシーケンス番号38とデータとを含むデータユニットの送信要求(CNL_DATA.req)をコネクション層22aに出力する(S209)。このデータユニットの送信要求は、S208でのポートエミュレータ242による送信要求(PCLC_SERIAL_XXX.req)に対応する要求である。つまり、シリアルアダプタ232aは、一つのデータユニットをResponder10bに送信した後、一つのデータユニットをResponder10bから受信するまで、新たなデータユニットを送信しないように制御している。
【0075】
そして、コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38(=y)を含むCSDUが、Responder10bに送信される(S210)。
【0076】
次いで、図13は、Initiator10aがResponder10bに一つのデータユニットを送信した後、Responder10bから一つのデータユニットを受信するまで、新たなデータユニットを送信することを待つ通信シーケンスの別の例を示す。
【0077】
まず、Initiator10aのポートエミュレータ242a(アプリケーション層24)は、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232a(プロトコル変換層23)に出力する(S301)。PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S302)。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S303)。
【0078】
なお、PCLシリアルアダプタ232aは、要求をコネクション層(CNL)22aに出力したことに応答して、タイマー(タイムアウト検出部35)による計測を開始する。タイマーは、S302で要求が出力されてからの経過時間を計測する。そして、PCLシリアルアダプタ232aは、Responder10bへの一つのデータユニットの送信要求を出力してから、Responder10bからの一つのデータユニットのインジケーションを受け取るまで、又はタイマーによって計測された経過時間がしきい値時間を超えるまで、新たなデータユニットの送信(送信要求)を待つように制御する。すなわち、PCLシリアルアダプタ232aは、上記の条件に該当する期間中、ポートエミュレータ242aによって新たなデータ送信要求が出力されても、コネクション層22aにデータユニットの送信要求が出力されないように制御する。
【0079】
Responder10bのコネクション層22bでは、Initiator10aのコネクション層22aによって送信されたCSDUが受信される。コネクション層22bでは、受信されたCSDUに含まれるInitiatorシーケンス番号38を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232bに出力される(S304)。
【0080】
また、Responder10bのコネクション層22bが、Initiator10aのコネクション層22aによって送信されたCSDUを受信するよりも前に、Responder10bのポートエミュレータ242b(アプリケーション層24)は、データやステータス等をInitiator10aに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232b(プロトコル変換層23)に出力する(S305)。PCLシリアルアダプタ232bは、この要求に応じて、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“y”を設定する。そして、PCLシリアルアダプタ232bは、Responderシーケンス番号48(=y)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22bに出力する(S306)。コネクション層(CNL)22bでは、PCLシリアルアダプタ232bによって出力されたデータユニットを用いて作成された、Responderシーケンス番号48を含むコネクション層サービスデータユニット(CSDU)が、Initiator10aに送信される(S307)。
【0081】
Initiator10aのコネクション層22aでは、Responder10bのコネクション層22bによって送信されたCSDUが受信される。コネクション層22aでは、受信されたCSDUに含まれるResponderシーケンス番号48を含むインジケーション(CNL_DATA.ind)がシリアルアダプタ232aに出力される(S308)。シリアルアダプタ232aは、このインジケーションに応じて、インジケーションに含まれるResponderシーケンス番号48(=y)を用いて、Initiatorシーケンス番号38を更新することにより、Initiatorシーケンス番号38に“y”を設定する。
【0082】
Initiatorシーケンス番号38が更新された後に、Initiator10aのポートエミュレータ242aが、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232aに出力したとき(S309)、PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=y)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S310)。すなわち、PCLシリアルアダプタ232aは、S302で一つのデータユニットをResponder10bに送信した後に、S308でResponder10bから一つのデータユニットを受信しており、データユニットの送信が可能であるので、次のデータユニットを送信するための要求をコネクション層(CNL)22aに出力する。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S311)。
【0083】
一方、Responder10bのシリアルアダプタ232bは、S304で、Initiatorシーケンス番号38(=x)を含むインジケーション(CNL_DATA.ind)を受け取ったことに応じて、このInitiatorシーケンス番号38とResponderシーケンス番号48とが等しいかどうかを判定する。そして、Initiatorシーケンス番号38(=x)とResponderシーケンス番号48(=y)とが等しくないので、シリアルアダプタ232bは、Initiator10aにACK(データユニット)を送信しない。つまり、シリアルアダプタ232bは、Initiatorシーケンス番号38とResponderシーケンス番号48とに基づいて、ACKを送信する必要がないことを検出することができる。これにより、Initiator10aによって送信されるデータユニットを受信したことに応じて、毎回ACKを返すような、不要なトラフィックを削減することができる。
【0084】
また、図14は、Initiator10aがResponder10bに一つのデータユニットを送信した後、タイムアウトを検出するまで、新たなデータユニットを送信することを待つ通信シーケンスの例を示す。
【0085】
まず、Initiator10aのポートエミュレータ242a(アプリケーション層24)は、データやステータス等をResponder10bに送信するための要求(PCLC_SERIAL_XXX.req)をPCLシリアルアダプタ232a(プロトコル変換層23)に出力する(S401)。PCLシリアルアダプタ232aは、この要求に応じて、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットを送信するための要求(CNL_DATA.req)を、コネクション層(CNL)22aに出力する(S402)。コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38を含むコネクション層サービスデータユニット(CSDU)が、Responder10bに送信される(S403)。
【0086】
なお、PCLシリアルアダプタ232aは、要求をコネクション層(CNL)22aに出力したことに応答して、タイマーによる計測を開始する。タイマーは、S402で要求が出力されてからの経過時間を計測する。そして、PCLシリアルアダプタ232aは、Responder10bへの一つのデータユニットの送信要求を出力してから、Responder10bからの一つのデータユニットのインジケーションを受け取るまで、又はタイマーによって計測された経過時間がしきい値時間を超えるまで、新たなデータユニットの送信(送信要求)を待つように制御する。すなわち、PCLシリアルアダプタ232aは、上記の条件に該当する期間中、ポートエミュレータ242aによって新たなデータ送信要求が出力されても、コネクション層22aにデータユニットの送信要求が出力されないように制御する。
【0087】
また、S402で送信要求が出力されてからの経過時間がしきい値時間を超えるよりも前に、ポートエミュレータ242aが、データ等をResponderに送信するための要求(PCLC_SERIAL_XXX.req)を出力したとき(S405)、シリアルアダプタ232aは、新たなデータユニットの送信要求をコネクション層22aに出力しない。そして、S402で送信要求が出力されてからの経過時間がしきい値時間を超えた場合(すなわち、タイムアウトを検出した場合)、シリアルアダプタ232aは、Initiatorシーケンス番号38(=x)とデータとを含むデータユニットの送信要求(CNL_DATA.req)をコネクション層22aに出力する(S406)。そして、コネクション層(CNL)22aでは、PCLシリアルアダプタ232aによって出力されたデータユニットを用いて作成された、Initiatorシーケンス番号38(=y)を含むCSDUが、Responder10bに送信される(S407)。これにより、例えば、Responder10bによって送信されるACKが、通信エラー等の不測の事態によってInitiator10aに届かなかったような場合でも、タイムアウトを検出することで通信(データ送信)を再開することができる。
【0088】
また、図15から図21は、電子機器10によって実行される通信シーケンスの種々のパターンの例を示す。上述のように、電子機器10は、Initiator10aとResponder10bのどちらとしても機能し得る。なお、以下に説明する通信シーケンスが開始される際のInitiatorシーケンス番号38とResponderシーケンス番号48とはいずれも“0”であることを想定する。
【0089】
図15は、Initiator10aのみデータを送信する通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S501)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、送信待ちデータ49がないとき、シーケンス番号“1”を含むACKをInitiator10aに送信する(S502)。これにより、Initiator10aにデータ送信の再開が促される。
【0090】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S503)。また、S504からS508において、S502及びS503と同様の通信シーケンスが繰り返される。
【0091】
図16は、Responder10bのみデータを送信する通信シーケンスの例を示す。
まず、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、データとシーケンス番号“1”とを含むデータユニットをInitiator10aに送信する(S511)。
【0092】
次いで、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、データとシーケンス番号“2”とを含むデータユニットをInitiator10aに送信する(S512)。また、S513からS514において、同様の通信シーケンスが繰り返される。
【0093】
図17は、Initiator10aとResponder10bの双方がデータを送信する通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S521)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”とデータとを含むデータユニットをInitiator10aに送信する(S522)。
【0094】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S523)。また、S524からS525において、S522及びS523と同様の通信シーケンスが繰り返される。
【0095】
図18は、Initiator10aがデータを連続して送信している間に、Responder10bが割り込んでデータを送信する通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S531)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”を含むACKをInitiator10aに送信する(S532)。
【0096】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S533)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、シーケンス番号“2”を含むACKをInitiator10aに送信する(S534)。
【0097】
次いで、Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。そして、Initiator10aは、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S535)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、シーケンス番号“3”とデータとを含むデータユニットをInitiator10aに送信する(S536)。また、S537からS538において、S533及びS534と同様の通信シーケンスが繰り返される。上述の通信シーケンスのように、Responder10bは、Initiator10aによる連続したデータ送信の間に、データ送信を行うことができる。
【0098】
図19は、Responder10bがデータを連続して送信している間に、Initiator10aが割り込んでデータを送信する通信シーケンスの例を示す。
まず、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、データとシーケンス番号“1”とを含むデータユニットをInitiator10aに送信する(S541)。Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。
【0099】
そして、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、データとシーケンス番号“2”とを含むデータユニットをInitiator10aに送信する(S542)。Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。
【0100】
次いで、Responder10bは、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、データとシーケンス番号“3”とを含むデータユニットをInitiator10aに送信する(S543)
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“3”を設定する。そして、Initiator10aは、シーケンス番号“3”とデータとを含むデータユニットをResponder10bに送信する(S544)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“4”を設定する。そして、Responder10bは、シーケンス番号“4”とデータとを含むデータユニットをInitiator10aに送信する(S545)。上述の通信シーケンスのように、Initiator10aは、必要なときにいつでも、Responder10bによるデータ送信に割り込むことができるので、Responder10bは、Initiator10aの状態を考慮することなく、データ送信を行うことができる。
【0101】
図20は、Initiator10aが送信したデータユニットに対応する、Responder10bからのACKがタイムアウトする通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S551)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”を含むACKをInitiator10aに送信する(S552)。
【0102】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S553)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“2”を設定する。そして、Responder10bは、シーケンス番号“2”を含むACKをInitiator10aに送信する(S554)。
【0103】
次いで、Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。そして、Initiator10aは、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S555)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。Responder10bは、シーケンス番号“3”を含むACKをInitiator10aに送信する(S556)。そして、ACKの送信が通信エラー等によって完了できなかった場合、Responder10bは、その通信エラーを検出したことに応答して、Responderシーケンス番号48をデクリメントすることによって、Responderシーケンス番号48に“2”を設定する。
【0104】
また、Initiator10aは、S555でデータユニットを送信してから所定時間が経過した場合、Responder10bによって送信される一つのデータユニット(又はACK)を待つことを中断(タイムアウト)し、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S557)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、シーケンス番号“3”を含むACKをInitiator10aに送信する(S558)。
【0105】
以上の通信シーケンスにより、Responder10bからの通信が不測の事態によって途絶えてしまった場合にも、Initiator10aはタイムアウトを検出することで、自身の通信を再開することができる。
【0106】
図21は、データユニットの送信に遅延がある通信シーケンスの例を示す。
まず、Initiator10aが、シーケンス番号“0”とデータとを含むデータユニットをResponder10bに送信する(S561)。Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“1”を設定する。そして、Responder10bは、シーケンス番号“1”を含むACKをInitiator10aに送信する(S562)。
【0107】
Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“1”を設定する。そして、Initiator10aは、シーケンス番号“1”とデータとを含むデータユニットをResponder10bに送信する(S563)。
【0108】
また、Responder10bは、S563でInitiator10aから送信されたデータユニットを受信するよりも前に、Responderシーケンス番号48をインクリメントして“2”を設定し、シーケンス番号“2”とデータとを含むデータユニットをInitiator10aに送信する(S564)。
【0109】
そして、Responder10bは、S563でInitiator10aから送信されたデータユニットを受信したとき、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しくないので、Responderシーケンス番号48をインクリメントせず、またInitiator10aに対してACKを送信しない。
【0110】
一方、Initiator10aは、Responder10bからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号を用いてInitiatorシーケンス番号38を更新することによって、Initiatorシーケンス番号38に“2”を設定する。そして、Initiator10aは、シーケンス番号“2”とデータとを含むデータユニットをResponder10bに送信する(S565)。
【0111】
Responder10bは、Initiator10aからデータユニットを受信し、受信したデータユニットに含まれるシーケンス番号と、Responderシーケンス番号48とが等しいので、Responderシーケンス番号48をインクリメントすることによって、Responderシーケンス番号48に“3”を設定する。そして、Responder10bは、シーケンス番号“3”を含むACKをInitiator10aに送信する(S566)。上述の通信シーケンスにより、データユニットが通信経路内でバッファリングされることにより、データユニットの伝送に遅延が生じても、Responder10bからInitiator10aに不要なACKを送ることなく(S563,S564等参照)、擬似的な全二重通信を実行することができる。
【0112】
図15から図21に示すいずれの通信シーケンスでも、Initiator10aが一つのデータユニットを送信した後、Responder10bから一つのACKを受信するまで、又はInitiator10aが一つのデータユニットを送信した後、所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御されることにより、Initiator10aとResponder10bとの間で擬似的な全二重通信を実現することができる。
【0113】
次いで、図22に示すフローチャートを参照して、電子機器10によって実行される通信制御処理の手順について説明する。ここでは、電子機器10がInitiatorとして動作し、Responderとして動作する外部デバイスとの間で通信を実行することを想定する。また、電子機器10と外部デバイスとの間で、シリアルプロトコルに基づくデータ伝送サービスが実行されることを想定する。
【0114】
まず、近接無線通信デバイス104は、外部デバイスが近接状態であるか否かを判定する(ブロックB101)。外部デバイスが近接状態でない場合(ブロックB101のNO)、ブロックB101に戻り、外部デバイスが近接状態であるか否かが再度判定される。
【0115】
外部デバイスが近接状態である場合(ブロックB101のYES)、近接無線通信デバイス104は、外部デバイスとの接続(CNL接続)を確立する(ブロックB102)。そして、PCLコントローラ231は、外部デバイスのPCLコントローラとの間でネゴシエーションを実行することによって、PCLシリアルアダプタ232を選択する(ブロックB103)。
【0116】
次いで、初期化部31は、Initiatorシーケンス番号38に0を設定する(ブロックB104)。そして、通信制御部32は、送信待ちのデータ39があるか否か(ポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する(ブロックB105)。送信待ちのデータ39がある場合(ブロックB105のYES)、データユニット生成部33は、送信待ちデータ39とInitiatorシーケンス番号38とを含むデータユニットを生成する(ブロックB106)。そして、データユニット送信部34は、生成されたデータユニットを外部デバイスに送信する(ブロックB107)。
【0117】
次いで、データユニット受信部36は、データユニットを外部デバイスから受信したか否かを判定する(ブロックB108)。外部デバイスからデータユニットを受信している場合(ブロックB108のYES)、データユニット受信部36は、受信したデータユニットに含まれるResponderシーケンス番号を読み出す(ブロックB109)。そして、シーケンス番号更新部37は、メモリ13等に格納されているInitiatorシーケンス番号38の値を、読み出されたResponderシーケンス番号の値で更新する(ブロックB110)。また、データユニット受信部46は、受信したデータユニットに含まれるデータ(受信データ)を読み出す(ブロックB111)。そして、通信制御部32は、ポートエミュレータ242等を介してアプリケーションプログラムに受信データを出力し(ブロックB112)、ブロックB105に戻る。
【0118】
また、外部デバイスからデータユニットを受信していない場合(ブロックB108のNO)、タイムアウト検出部35は、ブロックB107でデータユニットを送信してからの経過時間がしきい値時間を超えるか否かを判定する(ブロックB113)。データユニットを送信してからの経過時間がしきい値時間を超えるとき(ブロックB113のYES)、タイムアウトと判定され、ブロックB105に戻る。したがって、送信待ちデータ39がある場合には、現在設定されているInitiatorシーケンス番号38を含む新たなデータユニットが送信される。
【0119】
データユニットを送信してからの経過時間がしきい値時間以下であるとき(ブロックB113のNO)、通信制御部32は、外部デバイスとの近接状態が解除されているか否か、すなわち、外部デバイスとの接続が解除されているか否かを判定する(ブロックB114)。外部デバイスとの接続が解除されているとき(ブロックB114のYES)、処理を終了する。外部デバイスとの接続が解除されていないとき(ブロックB114のNO)、ブロックB108に戻り、外部デバイスによって送信されるデータユニットが受信されたか否かが再度判定される。
【0120】
また、ブロックB105で送信待ちのデータ39があるか否かを判定したときに、送信待ちのデータ39がない場合(ブロックB105のNO)、データユニット受信部46は、外部デバイスによって送信されたデータユニットを受信したか否かを判定する(ブロックB115)。外部デバイスによって送信されたデータユニットを受信していない場合(ブロックB115のNO)、ブロックB105に戻る。また、外部デバイスによって送信されたデータユニットを受信している場合(ブロックB115のYES)、データユニット受信部36は、受信したデータユニットに含まれるResponderシーケンス番号を読み出す(ブロックB109)。そして、シーケンス番号更新部37は、メモリ13等に格納されているInitiatorシーケンス番号38の値を、読み出されたResponderシーケンス番号の値で更新する(ブロックB110)。また、データユニット受信部46は、受信したデータユニットに含まれるデータ(受信データ)を読み出す(ブロックB111)。そして、通信制御部32は、ポートエミュレータ242等を介してアプリケーションプログラムに受信データを出力し(ブロックB112)、ブロックB105に戻る。
【0121】
上述のシーケンス番号を用いた通信制御処理により、Initiator10aである電子機器10は、外部デバイス(Responder10b)に一つのデータユニットを送信した後、一つのデータユニットを外部デバイスから受信するまで、又は外部デバイスに一つのデータユニットを送信してから所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御される。なお、電子機器10は、電子機器10から外部デバイスにデータユニットを送信することなく、外部デバイスから1以上のデータユニットを受信し得る。
【0122】
また、図23のフローチャートを参照して、電子機器10によって実行される通信制御処理の手順について説明する。ここでは、電子機器10がResponderとして動作し、Initiatorとして動作する外部デバイスとの間で通信を実行することを想定する。また、電子機器10と外部デバイスとの間で、シリアルプロトコルに基づくデータ伝送サービスが実行されることを想定する。
【0123】
まず、近接無線通信デバイス104は、外部デバイスが近接状態であるか否かを判定する(ブロックB201)。外部デバイスが近接状態でない場合(ブロックB201のNO)、ブロックB201に戻り、外部デバイスが近接状態であるか否かが再度判定される。
【0124】
外部デバイスが近接状態である場合(ブロックB201のYES)、近接無線通信デバイス104は、外部デバイスとの接続(CNL接続)を確立する(ブロックB202)。そして、PCLコントローラ231は、外部デバイスのPCLコントローラとの間でネゴシエーションを実行することによって、PCLシリアルアダプタ232を選択する(ブロックB203)。
【0125】
次いで、初期化部41は、Responderシーケンス番号48に0を設定する(ブロックB204)。そして、データユニット受信部46は、外部デバイスからデータユニットを受信したか否かを判定する(ブロックB205)。外部デバイスからデータユニットを受信している場合(ブロックB205のYES)、データユニット受信部46は、受信したデータユニットに含まれるInitiatorシーケンス番号を読み出す(ブロックB206)。また、データユニット受信部46は、受信したデータユニットに含まれるデータを読み出す(ブロックB207)。そして、通信制御部42は、ポートエミュレータ242等を介してアプリケーションプログラムに受信データを出力する(ブロックB208)。
【0126】
次いで、シーケンス番号判定部47は、読み出したInitiatorシーケンス番号と、メモリ103等に格納されたResponderシーケンス番号48とが等しいか否かを判定する(ブロックB209)。Initiatorシーケンス番号とResponderシーケンス番号48とが等しくない場合(ブロックB209のNO)、ブロックB105に戻る。
【0127】
一方、Initiatorシーケンス番号とResponderシーケンス番号48とが等しい場合(ブロックB209のYES)、通信制御部42は、送信待ちのデータ49があるか否か(ポートエミュレータ242によって、データの送信を要求するコマンドが出力されているか否か)を判定する(ブロックB210)。
【0128】
送信待ちのデータ49がある場合(ブロックB210のYES)、シーケンス番号更新部43は、Responderシーケンス番号48をインクリメントすることによって更新する(ブロックB211)。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。データユニット生成部44は、送信待ちデータ49とResponderシーケンス番号48とを含むデータユニットを生成する(ブロックB212)。データユニット送信部45は、生成されたデータユニットを外部デバイスに送信する(ブロックB213)。
【0129】
一方、送信待ちのデータ49がない場合(ブロックB210のNO)、シーケンス番号更新部43は、Responderシーケンス番号48をインクリメントすることによって更新する(ブロックB214)。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。データユニット生成部44は、Responderシーケンス番号48を含むACKを生成する(ブロックB215)。このACKは、データを含まないデータユニットである。データユニット送信部45は、生成されたACKを外部デバイスに送信する(ブロックB216)。
【0130】
また、ブロックB205で外部デバイスによって送信されるデータユニットが受信されたか否かを判定したときに、データユニットが受信されていない場合(ブロックB205のNO)、通信制御部42は、送信待ちデータ49があるか否かを判定する(ブロックB218)。送信待ちデータ49がない場合(ブロックB218のNO)、ブロックB205に戻る。また、送信待ちデータ49がある場合(ブロックB218のYES)、シーケンス番号更新部43は、Responderシーケンス番号48をインクリメントすることによって更新する(ブロックB211)。つまり、シーケンス番号更新部43は、Responderシーケンス番号に所定の値(例えば、1)を加算した値を、新たなResponderシーケンス番号48としてメモリ103等に保存する。データユニット生成部44は、送信待ちデータ49とResponderシーケンス番号48とを含むデータユニットを生成する(ブロックB212)。データユニット送信部45は、生成されたデータユニットを外部デバイスに送信する(ブロックB213)。
【0131】
ブロックB213でデータユニットを送信した後、又はブロックB216でACK(データを含まないデータユニット)を送信した後、通信制御部42は、外部デバイスとの近接状態が解除されているか否か、すなわち、外部デバイスとの接続が解除されているか否かを判定する(ブロックB217)。外部デバイスとの接続が解除されているとき(ブロックB217のYES)、処理を終了する。外部デバイスとの接続が解除されていないとき(ブロックB217のNO)、ブロックB205に戻り、外部デバイスによって送信されるデータユニットが受信されたか否かが再度判定される。
【0132】
上述のシーケンス番号を用いた通信制御処理により、Initiatorにおいて、複数のデータユニットを連続して送信するような要求が生じていても、Responderである電子機器10は、割り込んでデータ(データユニット)を送信することができる。
【0133】
以上説明したように、本実施形態によれば、非対称なデータ伝送を行うための伝送路で、擬似的に全二重通信を行うことができる。Initiator10aは、Responder10bに一つのデータユニットを送信した後、一つのデータユニットをResponder10bから受信するまで、又はResponder10bに一つのデータユニットを送信してから所定の時間が経過してタイムアウトするまで、次のデータユニットの送信を待つように制御される。これにより、Initiator10aにおいて、複数のデータユニットを連続して送信するような要求が生じていても、Responder10bは、割り込んでデータを送信することができる。したがって、コネクション層(CNL)22では、Responder10bよりもInitiator10aによるデータ伝送が優先される非対称な通信が実行される構成であっても、プロトコル変換層(PCL)23で通信制御プログラム109a,109b(シリアルアダプタ232)を実行することによって擬似的な全二重通信を実現することができる。
【0134】
なお、本実施形態の通信制御処理の手順は全てソフトウェアによって実行することができる。このため、通信制御処理の手順を実行するプログラムを格納したコンピュータ読み取り可能な記憶媒体を通じてこのプログラムを通常のコンピュータにインストールして実行するだけで、本実施形態と同様の効果を容易に実現することができる。
【0135】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0136】
109a…Initiator通信制御プログラム、109b…Responder通信制御プログラム、31…初期化部、32…通信制御部、33…データユニット生成部、34…データユニット送信部、35…タイムアウト検出部、36…データユニット受信部、37…シーケンス番号更新部、38…Initiatorシーケンス番号、39…送信待ちデータ、41…初期化部、42…通信制御部、43…シーケンス番号更新部、44…データユニット生成部、45…データユニット送信部、46…データユニット受信部、47…シーケンス番号判定部、48…Responderシーケンス番号、49…送信待ちデータ。
【特許請求の範囲】
【請求項1】
外部デバイスとの通信を実行する通信モジュールと、
前記通信に用いられる第1シーケンス番号を格納するシーケンス番号記憶手段と、
データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成するデータユニット生成手段と、
前記通信モジュールを用いて、前記外部デバイスに前記第1データユニットを送信するデータユニット送信手段と、
前記通信モジュールを用いて、前記外部デバイスから第2シーケンス番号を含む第2データユニットを受信するデータユニット受信手段と、
前記第2シーケンス番号を用いて前記格納された第1シーケンス番号を更新するシーケンス番号更新手段とを具備し、
前記データユニット送信手段は、前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記データユニット受信手段により第2データユニットが受信された後に、前記新たなデータと前記シーケンス番号更新手段により更新された第1シーケンス番号とを含む新たな第1データユニットを送信する電子機器。
【請求項2】
前記第1データユニットが送信されてからのしきい値時間の経過を検出するタイムアウト検出手段をさらに具備し、
前記データユニット送信手段は、前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記データユニット受信手段が第2データユニットを受信する前に、前記タイムアウト検出手段が前記しきい値時間の経過を検出した場合に、前記新たなデータと前記第1シーケンス番号とを含む新たな第1データユニットを送信する請求項1記載の電子機器。
【請求項3】
前記データユニット受信手段がデータを含まない第2データユニットを受信した場合で、かつ次に送信する第1データユニットがデータを含まない場合、前記第1データユニット送信後のタイムアウト検出処理を行わない請求項2記載の電子機器。
【請求項4】
前記通信モジュールは、当該通信モジュールと前記外部デバイスとが近接状態である場合に、近接無線通信を実行する請求項1記載の電子機器。
【請求項5】
前記通信モジュールは、前記外部デバイスよりも前記通信を実行するための優先度が高い請求項1記載の電子機器。
【請求項6】
外部デバイスとの通信を実行する通信モジュールと、
前記通信に用いられる第2シーケンス番号を格納するシーケンス番号記憶手段と、
前記通信モジュールを用いて、前記外部デバイスから第1シーケンス番号を含む第1データユニットを受信するデータユニット受信手段と、
前記第1データユニットを受信した際、前記第1シーケンス番号と前記第2シーケンス番号との比較を行い、前記第1シーケンス番号と前記第2シーケンス番号とが等しいとき、前記第2シーケンス番号に所定の値を加算することによって前記第2シーケンス番号を更新するシーケンス番号更新手段と、
前記更新された第2シーケンス番号を含む第2データユニットを生成するデータユニット生成手段と、
前記通信モジュールを用いて、前記外部デバイスに前記第2データユニットを送信するデータユニット送信手段とを具備する電子機器。
【請求項7】
前記データユニット生成手段は、送信待ちのデータがある場合、前記送信待ちのデータと前記更新された第2シーケンス番号とを含む第2データユニットを生成する請求項6記載の電子機器。
【請求項8】
前記通信モジュールは、当該通信モジュールと前記外部デバイスとが近接状態である場合に、近接無線通信を実行する請求項6記載の電子機器。
【請求項9】
前記通信モジュールは、前記外部デバイスよりも前記通信を実行するための優先度が低い請求項6記載の電子機器。
【請求項10】
通信を実行する第1装置と第2装置とによって構成される通信システムであって、
前記第1装置は、
前記通信に用いられる第1シーケンス番号を格納し、
データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成し、
前記第2装置に前記第1データユニットを送信し、
前記第2装置から第2シーケンス番号を含む第2データユニットを受信し、
前記第2シーケンス番号を用いて前記格納された第1シーケンス番号の値を更新し、
前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記第2データユニットが受信された後に、前記新たなデータと前記更新された第1シーケンス番号とを含む新たな第1データユニットを送信するように構成され、
前記第2装置は、
前記第2シーケンス番号を格納し、
前記第1装置から前記第1データユニットを受信し、
前記第1シーケンス番号と前記第2シーケンス番号とが等しいとき、前記第2シーケンス番号に所定の値を加算することによって前記第2シーケンス番号を更新し、
前記更新された第2シーケンス番号を含む第2データユニットを生成し、
前記外部デバイスに前記第2データユニットを送信するように構成される通信システム。
【請求項1】
外部デバイスとの通信を実行する通信モジュールと、
前記通信に用いられる第1シーケンス番号を格納するシーケンス番号記憶手段と、
データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成するデータユニット生成手段と、
前記通信モジュールを用いて、前記外部デバイスに前記第1データユニットを送信するデータユニット送信手段と、
前記通信モジュールを用いて、前記外部デバイスから第2シーケンス番号を含む第2データユニットを受信するデータユニット受信手段と、
前記第2シーケンス番号を用いて前記格納された第1シーケンス番号を更新するシーケンス番号更新手段とを具備し、
前記データユニット送信手段は、前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記データユニット受信手段により第2データユニットが受信された後に、前記新たなデータと前記シーケンス番号更新手段により更新された第1シーケンス番号とを含む新たな第1データユニットを送信する電子機器。
【請求項2】
前記第1データユニットが送信されてからのしきい値時間の経過を検出するタイムアウト検出手段をさらに具備し、
前記データユニット送信手段は、前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記データユニット受信手段が第2データユニットを受信する前に、前記タイムアウト検出手段が前記しきい値時間の経過を検出した場合に、前記新たなデータと前記第1シーケンス番号とを含む新たな第1データユニットを送信する請求項1記載の電子機器。
【請求項3】
前記データユニット受信手段がデータを含まない第2データユニットを受信した場合で、かつ次に送信する第1データユニットがデータを含まない場合、前記第1データユニット送信後のタイムアウト検出処理を行わない請求項2記載の電子機器。
【請求項4】
前記通信モジュールは、当該通信モジュールと前記外部デバイスとが近接状態である場合に、近接無線通信を実行する請求項1記載の電子機器。
【請求項5】
前記通信モジュールは、前記外部デバイスよりも前記通信を実行するための優先度が高い請求項1記載の電子機器。
【請求項6】
外部デバイスとの通信を実行する通信モジュールと、
前記通信に用いられる第2シーケンス番号を格納するシーケンス番号記憶手段と、
前記通信モジュールを用いて、前記外部デバイスから第1シーケンス番号を含む第1データユニットを受信するデータユニット受信手段と、
前記第1データユニットを受信した際、前記第1シーケンス番号と前記第2シーケンス番号との比較を行い、前記第1シーケンス番号と前記第2シーケンス番号とが等しいとき、前記第2シーケンス番号に所定の値を加算することによって前記第2シーケンス番号を更新するシーケンス番号更新手段と、
前記更新された第2シーケンス番号を含む第2データユニットを生成するデータユニット生成手段と、
前記通信モジュールを用いて、前記外部デバイスに前記第2データユニットを送信するデータユニット送信手段とを具備する電子機器。
【請求項7】
前記データユニット生成手段は、送信待ちのデータがある場合、前記送信待ちのデータと前記更新された第2シーケンス番号とを含む第2データユニットを生成する請求項6記載の電子機器。
【請求項8】
前記通信モジュールは、当該通信モジュールと前記外部デバイスとが近接状態である場合に、近接無線通信を実行する請求項6記載の電子機器。
【請求項9】
前記通信モジュールは、前記外部デバイスよりも前記通信を実行するための優先度が低い請求項6記載の電子機器。
【請求項10】
通信を実行する第1装置と第2装置とによって構成される通信システムであって、
前記第1装置は、
前記通信に用いられる第1シーケンス番号を格納し、
データの送信が要求されたとき、前記データと前記第1シーケンス番号とを含む第1データユニットを生成し、
前記第2装置に前記第1データユニットを送信し、
前記第2装置から第2シーケンス番号を含む第2データユニットを受信し、
前記第2シーケンス番号を用いて前記格納された第1シーケンス番号の値を更新し、
前記第1データユニットが送信された後に新たなデータの送信が要求された場合、前記第2データユニットが受信された後に、前記新たなデータと前記更新された第1シーケンス番号とを含む新たな第1データユニットを送信するように構成され、
前記第2装置は、
前記第2シーケンス番号を格納し、
前記第1装置から前記第1データユニットを受信し、
前記第1シーケンス番号と前記第2シーケンス番号とが等しいとき、前記第2シーケンス番号に所定の値を加算することによって前記第2シーケンス番号を更新し、
前記更新された第2シーケンス番号を含む第2データユニットを生成し、
前記外部デバイスに前記第2データユニットを送信するように構成される通信システム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【公開番号】特開2012−227619(P2012−227619A)
【公開日】平成24年11月15日(2012.11.15)
【国際特許分類】
【出願番号】特願2011−91448(P2011−91448)
【出願日】平成23年4月15日(2011.4.15)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
【公開日】平成24年11月15日(2012.11.15)
【国際特許分類】
【出願日】平成23年4月15日(2011.4.15)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
[ Back to top ]