(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-08-29
(45)【発行日】2022-09-06
(54)【発明の名称】コンピュータプログラム、及び、制御方法
(51)【国際特許分類】
G06F 13/10 20060101AFI20220830BHJP
G06F 13/38 20060101ALI20220830BHJP
G06F 3/00 20060101ALI20220830BHJP
G06F 9/445 20180101ALI20220830BHJP
【FI】
G06F13/10 330C
G06F13/38 350
G06F3/00 A
G06F13/38 320Z
G06F9/445 120
(21)【出願番号】P 2018103306
(22)【出願日】2018-05-30
【審査請求日】2021-02-05
(73)【特許権者】
【識別番号】501428545
【氏名又は名称】株式会社デンソーウェーブ
(74)【代理人】
【識別番号】110000110
【氏名又は名称】弁理士法人 快友国際特許事務所
(72)【発明者】
【氏名】三和 剛
【審査官】田名網 忠雄
(56)【参考文献】
【文献】特許第5281402(JP,B1)
【文献】特開2012-173956(JP,A)
【文献】特開2011-014124(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 13/10-13/14
G06F 13/38-13/42
G06F 3/00
G06F 9/445
(57)【特許請求の範囲】
【請求項1】
USB(Universal Serial Busの略)ポートと、コンピュータと、を備えるホスト機器のためのコンピュータプログラムであって、
前記コンピュータは、
OS(Operating Systemの略)と、
ユーザ領域で動作するユーザアプリケーションと、
前記OSの機能の一部を利用することを可能にするためのインターフェースであるAPI(Application Programming Interfaceの略)と、
カーネル領域で動作するCDC(Communication Device Classの略)ドライバと、を備え、
前記OSは、
前記USBポートに、CDCクラスのUSBデバイスである周辺装置が接続される場合に、前記CDCドライバを前記カーネル領域内においてロードすることによって仮想シリアルポートを生成し、
前記USBポートと前記周辺装置の接続が解除される場合に、前記CDCドライバをアンロードすることによって前記仮想シリアルポートを消滅させ、
前記仮想シリアルポートは、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達するために利用される仮想的なポートであ
り、
前記コンピュータプログラムは、前記ユーザ領域のうち、前記ユーザアプリケーションと前記APIとの間で動作するプログラムであって、前記コンピュータに、以下の各処理、即ち、
前記仮想シリアルポートが
存在する間に、前記CDCドライバがアンロードされたことを検知する、アンロード検知処理であって、
前記CDCドライバがアンロードされると、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達不可能な状態が構築され、前記CDCドライバがアンロードされて、前記仮想シリアルポートが消滅した後に、前記APIから受信される異常通知は、前記ユーザアプリケーションに送信されない、前記アンロード検知処理と、
前記アンロード検知処理の後に、前記周辺装置が前記USBポートに再接続されることに伴って、前記CDCドライバが前記カーネル領域内で再ロードされることを検知する、再ロード検知処理と、
前記CDCドライバの再ロードが検知される場合に、前記仮想シリアルポートが再生成されることに伴って、
前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達可能な状態を再び構築する、再
構築処理と、
を実行させる、
コンピュータプログラム。
【請求項2】
前記アンロード検知処理は、前記OSから、前記CDCドライバがアンロードされたことに関係する第1のイベント通知を取得することにより、前記CDCドライバがアンロードされたことを検知することを含み、
前記再ロード検知処理は、前記OSから、前記CDCドライバが再ロードされることに関係する第2のイベント通知を取得することにより、前記CDCドライバが再ロードされたことを検知することを含む、
請求項1に記載のコンピュータプログラム。
【請求項3】
前記アンロード検知処理は、前記OSから定期的に第1の状態情報を取得し、取得済みの前記第1の状態情報が、前記CDCドライバがアンロードされたことに関係する状態を示す場合に、前記CDCドライバがアンロードされたことを検知することを含み、
前記再ロード検知処理は、前記OSから定期的に第2の状態情報を取得し、取得済みの前記第2の状態情報が、前記CDCドライバが再ロードされたことに関係する状態を示す場合に、前記CDCドライバが再ロードされたことを検知することを含む、
請求項1に記載のコンピュータプログラム。
【請求項4】
前記アンロード検知処理は、前記OSから、前記CDCドライバがアンロードされたことに関係する第1の割り込み通知を取得することにより、前記CDCドライバがアンロードされたことを検知することを含み、
前記再ロード検知処理は、前記OSから、前記CDCドライバが再ロードされることに関係する第2の割り込み通知を取得することにより、前記CDCドライバが再ロードされたことを検知することを含む、
請求項1に記載のコンピュータプログラム。
【請求項5】
USB(Universal Serial Busの略)ポートと、コンピュータと、を備えるホスト機器の制御方法であって、
前記コンピュータは、
OS(Operating Systemの略)と、
ユーザ領域で動作するユーザアプリケーションと、
前記OSの機能の一部を利用することを可能にするためのインターフェースであるAPI(Application Programming Interfaceの略)と、
カーネル領域で動作するCDC(Communication Device Classの略)ドライバと、を備え、
前記OSは、
前記USBポートに、CDCクラスのUSBデバイスである周辺装置が接続される場合に、前記CDCドライバを前記カーネル領域内においてロードすることによって仮想シリアルポートを生成し、
前記USBポートと前記周辺装置の接続が解除される場合に、前記CDCドライバをアンロードすることによって前記仮想シリアルポートを消滅させ、
前記仮想シリアルポートは、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達するために利用される仮想的なポートであ
り、
前記制御方法は、前記コンピュータが実行する以下の各ステップ、即ち、
前記仮想シリアルポートが
存在する間に、前記CDCドライバがアンロードされたことを検知する、アンロード検知ステップであって、
前記CDCドライバがアンロードされると、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達不可能な状態が構築され、前記CDCドライバがアンロードされて、前記仮想シリアルポートが消滅した後に、前記APIから受信される異常通知は、前記ユーザアプリケーションに送信されない、前記アンロード検知ステップと、
前記アンロード検知ステップの後に、前記周辺装置が前記USBポートに再接続されることに伴って、前記CDCドライバが前記カーネル領域内で再ロードされることを検知する、再ロード検知ステップと、
前記CDCドライバの再ロードが検知される場合に、前記仮想シリアルポートが再生成されることに伴って、
前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達可能な状態を再び構築する、再
構築ステップと、
を含む、
制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本明細書で開示する技術は、USB(Universal Serial Busの略)ポートと、コンピュータと、を備えるホスト機器のためのコンピュータプログラム、及び、当該ホスト機器の制御方法に関する。
【背景技術】
【0002】
USBポートと、コンピュータと、を備えるホスト機器が知られている。そして、このようなホスト機器のUSBポートに、周辺装置(例えば情報コード読取装置)を接続して使用する場合があることも知られている。ホスト機器のコンピュータは、ユーザ領域で動作するユーザアプリケーションと、少なくとも一部がユーザ領域で動作するAPI(Application Programming Interfaceの略)と、カーネル領域で動作するCDC(Communication Device Classの略)ドライバと、を備え、USBポートに周辺装置が接続される場合に、CDCドライバをカーネル領域内においてロードすることによって仮想シリアルポートを生成し、ユーザアプリケーションと周辺装置とが仮想シリアルポートを利用して相互に情報を伝達可能な状態を構築する。
【0003】
このようなホスト機器において、仮想シリアルポートが使用されている間に、USBポートと周辺装置との接続が解除される場合がある。その場合、CDCドライバがアンロードされ、それに伴って仮想シリアルポートが消滅し、ユーザアプリケーションと周辺装置とが仮想シリアルポートを利用して相互に情報を伝達することができなくなる。この際、予期せず仮想シリアルポートが消滅することにより、ユーザアプリケーションが正常に動作できなくなる事態が発生する可能性がある。
【0004】
そのため、従来、特許文献1に示すような、ユーザアプリケーションが正常に動作できなくなることを抑制するための特別なCDCドライバが開発されている。特許文献1に開示されているCDCドライバは、USBポートに周辺装置が接続される場合に、COMポートインターフェース部と、ドライバポート部と、によって構成される機能ドライバを構築する。COMポートインターフェース部は、ユーザアプリケーションに対する仮想シリアルポートとして機能し、ドライバポート部は、周辺装置に対するリンクを提供する。特許文献1の技術によると、USBポートと周辺装置との接続が解除される場合には、COMポートインターフェース部は、ドライバポート部との接続を解除する。ただし、COMポートインターフェース部は、ユーザアプリケーションが正常に動作できなくなることを避けるために、ユーザアプリケーションからの伝達情報に対して適切な応答を提供する。その後、周辺装置がUSBポートに再接続される場合に、COMポートインターフェース部は、ドライバポート部との接続を再確立させる。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
特許文献1の技術では、ユーザアプリケーションが正常に動作できなくなることを抑制するためのCDCドライバは、カーネル領域で動作する。カーネル領域で動作するCDCドライバは、OS(Operating Systemの略)の構成の影響を受けやすく、CDCドライバを提供する提供者(例えば周辺装置のベンダ等)は、OSの種類、各OSのバージョンに合わせた専用のCDCドライバをその都度準備する必要がある。また、ホスト機器の利用者も、その都度、専用のCDCドライバをコンピュータに記憶させておく必要がある。そのため、CDCドライバの提供者及びホスト機器の利用者の負担が大きかった。
【0007】
本明細書では、従来に比べて、プログラムの提供者及びホスト機器の利用者の負担を軽減し得る技術を提供する。
【課題を解決するための手段】
【0008】
本明細書は、USB(Universal Serial Busの略)ポートと、コンピュータと、を備えるホスト機器のためのコンピュータプログラムを開示する。前記コンピュータは、OS(Operating Systemの略)と、ユーザ領域で動作するユーザアプリケーションと、前記OSの機能の一部を利用することを可能にするためのインターフェースであるAPI(Application Programming Interfaceの略)と、カーネル領域で動作するCDC(Communication Device Classの略)ドライバと、を備える。前記OSは、前記USBポートに、CDCクラスのUSBデバイスである周辺装置が接続される場合に、前記CDCドライバを前記カーネル領域内においてロードすることによって仮想シリアルポートを生成し、前記USBポートと前記周辺装置の接続が解除される場合に、前記CDCドライバをアンロードすることによって前記仮想シリアルポートを消滅させる。前記仮想シリアルポートは、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達するために利用される仮想的なポートであって、オープン状態とクローズ状態のうちの一方の状態に設定され、前記オープン状態の間は、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達可能であり、前記クローズ状態の間は、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達不可能である。前記コンピュータプログラムは、前記ユーザ領域のうち、前記ユーザアプリケーションと前記APIとの間で動作するプログラムであって、前記コンピュータに、以下の各処理、即ち、前記仮想シリアルポートが前記オープン状態である間に、前記CDCドライバがアンロードされたことを検知する、アンロード検知処理と、前記CDCドライバのアンロードが検知される場合に、前記APIから受信される異常通知を前記ユーザアプリケーションに送信することなく、前記仮想シリアルポートの状態を前記クローズ状態に設定する、クローズ処理と、前記仮想シリアルポートの状態が前記クローズ状態である間に、前記周辺装置が前記USBポートに再接続されることに伴って、前記CDCドライバが前記カーネル領域内で再ロードされることを検知する、再ロード検知処理と、前記CDCドライバの再ロードが検知される場合に、前記仮想シリアルポートの状態を前記オープン状態に設定する、再オープン処理と、を実行させる。
【0009】
上記のコンピュータプログラムによると、前記仮想シリアルポートが前記オープン状態である間に、周辺装置とUSBポートとの接続が解除されることに伴って、ユーザアプリケーションが正常に動作しなくなる事態を抑制することができる。また、上記のコンピュータプログラムは、ユーザ領域のうち、ユーザアプリケーションとAPIとの間で動作する。一般的に、OSが更新される場合であっても、ユーザ領域内で動作するユーザアプリケーション及びAPIの仕様が変更されることは少ない。そのため、上記のコンピュータプログラムによると、ユーザアプリケーションが正常に動作できなくなることを抑制するためにカーネル領域で動作する従来のCDCドライバに比べて、OSの更新等に伴って、コンピュータプログラムの提供者(例えば周辺装置のベンダ等)が、当該バージョンのOSのための専用のコンピュータプログラムをその都度準備しなければならない可能性は低い。また、ホスト機器の利用者が、その都度、専用のプログラムをコンピュータに記憶させておく必要もない。そのため、上記のコンピュータプログラムによると、従来に比べて、プログラムの提供者及びホスト機器の利用者の負担を軽減し得る。
【0010】
前記アンロード検知処理は、前記OSから、前記CDCドライバがアンロードされたことに関係する第1のイベント通知を取得することにより、前記CDCドライバがアンロードされたことを検知することを含んでもよい。前記再ロード検知処理は、前記OSから、前記CDCドライバが再ロードされることに関係する第2のイベント通知を取得することにより、前記CDCドライバが再ロードされたことを検知することを含んでもよい。
【0011】
この構成によると、CDCドライバのアンロード及び再ロードが適切なタイミングで検知され得る。
【0012】
前記アンロード検知処理は、前記OSから定期的に第1の状態情報を取得し、取得済みの前記第1の状態情報が、前記CDCドライバがアンロードされたことに関係する状態を示す場合に、前記CDCドライバがアンロードされたことを検知することを含んでもよい。前記再ロード検知処理は、前記OSから定期的に第2の状態情報を取得し、取得済みの前記第2の状態情報が、前記CDCドライバが再ロードされたことに関係する状態を示す場合に、前記CDCドライバが再ロードされたことを検知することを含んでもよい。
【0013】
この構成による場合も、CDCドライバのアンロード及び再ロードが適切なタイミングで検知され得る。
【0014】
前記アンロード検知処理は、前記OSから、前記CDCドライバがアンロードされたことに関係する第1の割り込み通知を取得することにより、前記CDCドライバがアンロードされたことを検知することを含んでもよい。前記再ロード検知処理は、前記OSから、前記CDCドライバが再ロードされることに関係する第2の割り込み通知を取得することにより、前記CDCドライバが再ロードされたことを検知することを含んでもよい。
【0015】
この構成によると、アンロード検知処理に続く各処理、及び、再ロード検知処理に続く各処理が優先的に実行され得る。
【0016】
また、本明細書は、USB(Universal Serial Busの略)ポートと、コンピュータと、を備えるホスト機器の制御方法も開示する。前記コンピュータは、OS(Operating Systemの略)と、ユーザ領域で動作するユーザアプリケーションと、前記OSの機能の一部を利用することを可能にするためのインターフェースであるAPI(Application Programming Interfaceの略)と、カーネル領域で動作するCDC(Communication Device Classの略)ドライバと、を備える。前記OSは、前記USBポートに、CDCクラスのUSBデバイスである周辺装置が接続される場合に、前記CDCドライバを前記カーネル領域内においてロードすることによって仮想シリアルポートを生成し、前記USBポートと前記周辺装置の接続が解除される場合に、前記CDCドライバをアンロードすることによって前記仮想シリアルポートを消滅させる。前記仮想シリアルポートは、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達するために利用される仮想的なポートであって、オープン状態とクローズ状態のうちの一方の状態に設定され、前記オープン状態の間は、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達可能であり、前記クローズ状態の間は、前記ユーザアプリケーションと前記周辺装置とが相互に情報を伝達不可能である。前記制御方法は、以下の各ステップ、即ち、前記仮想シリアルポートが前記オープン状態である間に、前記CDCドライバがアンロードされたことを検知する、アンロード検知ステップと、前記CDCドライバのアンロードが検知される場合に、前記APIから受信される異常通知を前記ユーザアプリケーションに送信することなく、前記仮想シリアルポートの状態を前記クローズ状態に設定する、クローズステップと、前記仮想シリアルポートの状態が前記クローズ状態である間に、前記周辺装置が前記USBポートに再接続されることに伴って、前記CDCドライバが前記カーネル領域内で再ロードされることを検知する、再ロード検知ステップと、前記CDCドライバの再ロードが検知される場合に、前記仮想シリアルポートの状態を前記オープン状態に設定する、再オープンステップと、を含む。
【0017】
上記の制御方法による場合も、前記仮想シリアルポートが前記オープン状態である間に、周辺装置とUSBポートとの接続が解除されることに伴って、ユーザアプリケーションが正常に動作しなくなる事態を抑制することができる。また、上記の制御方法に含まれる各ステップは、ユーザ領域のうち、ユーザアプリケーションとAPIとの間の情報の伝達に関係するステップである。そのため、OSの更新等に伴って、各ステップの実行手法が変更される可能性が少なく、各ステップの実行手法の更新の負担が軽減され得る。そのため、上記の制御方法によると、従来に比べて、各ステップの実行手法の提供者及びホスト機器の利用者の負担を軽減し得る。
【図面の簡単な説明】
【0018】
【
図1】第1実施例の機能実行システム2のブロック図を示す。
【
図2】第1実施例のホスト機器10の状態の遷移を表わす構成図を示す。
【
図4】第1、第3実施例において、ホスト機器10のCPU20がミドルウェアプログラム36に従って実行するポート管理処理のフローチャートを示す。
【
図5】CPU20が実行するデータ送信処理のフローチャートを示す。
【
図6】CPU20が実行するデータ受信処理のフローチャートを示す。
【
図7】比較例のホスト機器の状態の遷移を表わす構成図を示す。
【
図9】第2実施例において、ホスト機器10のCPU20がミドルウェアプログラム36に従って実行するポート管理処理のフローチャートを示す。
【
図10】第2実施例において、CPU20が実行する状態移行処理のフローチャートを示す。
【発明を実施するための形態】
【0019】
(第1実施例)
(システムの構成;
図1)
図1に示される機能実行システム2は、ホスト機器10に周辺装置50を通信可能な態様で接続し、周辺装置50を利用して所望の機能(例えば情報コードの読み取り機能)を実行するためのシステムである。
図1に示されるように、機能実行システム2は、ホスト機器10と、周辺装置50と、を備えている。ホスト機器10と周辺装置50とはUSB(Universal Serial Busの略)ケーブル60を介して相互に通信可能な態様で有線接続されている。
【0020】
(ホスト機器10の構成)
ホスト機器10は、デスクトップPC等の据置型の機器であってもよいし、ノートPC、タブレットPC等の可搬型の機器であってもよい。ホスト機器10は、CPU20と、メモリ30と、USBポート40と、を備えている。
【0021】
CPU20は、メモリ30に記憶されている各種プログラム(OS(Operating Systemの略)プログラム32、ユーザアプリケーションプログラム34、ミドルウェアプログラム36等)に従って、様々な処理を実行する。
【0022】
メモリ30は、上記の通り、OSプログラム32、ユーザアプリケーションプログラム34、及び、ミドルウェアプログラム36を記憶している。以下では、ユーザアプリケーションプログラム34、ミドルウェアプログラム36のことを、それぞれ、「アプリケーション34」、「ミドルウェア36」と呼ぶ場合がある。
【0023】
OSプログラム32は、ホスト機器10の動作全般を制御するための制御プログラムである。OSプログラム32は、ホスト機器10の出荷時点で既にホスト機器10にインストールされている。以下、本明細書では、CPU20がOSプログラム32に従って処理を実行することを、単にOSの動作として説明する場合がある。
【0024】
アプリケーション34は、周辺装置50等の各種装置を利用してユーザが所望の機能(例えば情報コードの読み取り)を実行するための制御プログラムである。アプリケーション34は、当該プログラムのベンダ(例えば、アプリケーションプログラムの開発業者)によって提供されるサーバ(図示省略)からインターネットを介してホスト機器10にインストールされる。他の例では、アプリケーション34は、他の方法でホスト機器10にインストールされてもよい。
【0025】
ミドルウェア36は、CPU20が、アプリケーション34に従って周辺装置50を利用した所望の機能を実行する際に、補助的に機能する制御プログラムである。本実施例のミドルウェア36が請求項の「コンピュータプログラム」の一例である。ミドルウェア36は、例えば、周辺装置50のベンダによって提供されるサーバ(図示省略)からインターネットを介してホスト機器10にインストールされる。他の例では、ミドルウェア36は、周辺装置50と共に出荷されるメディアからホスト機器10にインストールされてもよい。CPU20がミドルウェア36に従って実行する処理(
図4~
図6等参照)については後で詳しく説明する。
【0026】
メモリ30は、さらに、処理の過程で取得、生成等される各種情報を記憶させるための記憶領域(図示省略)も備えている。
【0027】
USBポート40は、USBケーブル60を接続するためのポートである。CPU20は、USBケーブル60を介して外部装置(例えば周辺装置50)との間で有線通信を実行することができる。
【0028】
(周辺装置50の構成)
本実施例の周辺装置50は、バーコード、二次元コード等の情報コードに記録されているデータを読み取るための情報コード読取装置である。他の例では、周辺装置50は、プリンタ、スキャナ等、情報コード読取装置以外のホスト機器10の周辺機器であってもよい。本実施例では、周辺装置50は、USBケーブル60を介してホスト機器10のUSBポート40に接続されることで、周辺装置50を利用して読み取ったデータをホスト機器10に出力すること等ができる。
【0029】
(本実施例におけるホスト機器10の状況の遷移;
図2、
図3)
図2、
図3を参照して、本実施例の機能実行システム2において、ホスト機器10に有線接続されていた周辺装置50の接続が解除され、再度接続される場合における、ホスト機器10の状況の遷移を説明する。ここで、
図2、
図3は、ホスト機器10にインストールされたOSプログラム32によって管理される各要素の構成および配置を模式的に示している。
図2、
図3はメモリ空間内の各要素間の情報伝達経路を示す構成図であると理解してもよい。
【0030】
図2、
図3に示されるように、OSプログラム32によって実現されるメモリ空間は、ユーザ領域200と、カーネル領域300と、を含む。ユーザ領域200は、アプリケーション領域とも呼ばれ、ホスト機器10のユーザが自身で変更可能な領域である。カーネル領域300は、OSのカーネルが存在する領域である。カーネルとは、コンピュータを構成するハードウェア資源と、アプリケーションソフトウェアとの間のやりとりを中継するためのプログラム部分である。カーネルのことを、OSの中核的部分と理解してもよい。
【0031】
図2の(a)に示すように、ユーザ領域200には、アプリケーション100と、ミドルウェア110と、が含まれる。アプリケーション100及びミドルウェア110は、ユーザ領域200で動作すると言い換えてもよい。そして、
図2の(a)に示すように、周辺装置50とUSBポートとが通信可能な態様で有線接続されている場合には、カーネル領域300には、仮想シリアルポート130と、CDC(Communication Device Classの略)ドライバ140と、USBコントローラ150と、USBポート40の一部と、が含まれる。仮想シリアルポート130、CDCドライバ140、USBコントローラ150、及び、USBポート40の一部は、カーネル領域300で動作すると言い換えてもよい。また、APIはOSの機能の一部を利用することを可能にするためのインターフェースであり、構成および配置の便宜上、カーネル領域とユーザ領域の境界に位置する。USBポートはUSBコントローラと周辺装置を接続するコネクタまたはHUBであり、構成および配置の便宜上、カーネル領域と外部との境界に位置する。
【0032】
アプリケーション100は、
図1のアプリケーション34に相当するプログラムである。アプリケーション100は、ユーザ領域200の最上位の範囲に配置され、この範囲で動作する。
【0033】
ミドルウェア110は、
図1のミドルウェア36に相当するプログラムである。ミドルウェア110は、ユーザ領域200のうちのアプリケーション100とAPI120との間の範囲に配置され、アプリケーション100とAPI120との間で動作する。
【0034】
API120は、OSが提供するAPIであって、アプリケーション100、ミドルウェア110等の他のプログラムが、OSの機能の一部を利用することを可能にするためのインターフェースである。API120は、一部が、ユーザ領域200のうちのミドルウェア110より下位の範囲に配置され、他の一部が、カーネル領域300の最上位の範囲に配置される。
【0035】
仮想シリアルポート130は、OSによってCDCドライバ140がカーネル領域300内にロードされることに伴って、OSによって生成される仮想的なシリアルポートである。仮想シリアルポート130とは、アプリケーション100と周辺装置50とが相互に情報を伝達するために利用される仮想的なポートである。仮想シリアルポート130は、オープン状態とクローズ状態のうちの一方の状態に設定され、オープン状態の間は、アプリケーション100と周辺装置50とが相互に情報を伝達可能な状態を構築し、クローズ状態の間は、アプリケーション100と周辺装置50とが相互に情報を伝達不可能な状態を構築する。仮想シリアルポート130は、カーネル領域300のうちのAPI120の下位であってCDCドライバ140の上位の範囲に配置され、動作する。
【0036】
CDCドライバ140は、仮想シリアルポート130を制御するためのドライバプログラムである。CDCドライバ140は、周辺装置50とUSBポート40とが通信可能な態様で有線接続される場合に、OSによってカーネル領域300内にロードされる。CDCドライバ140は、OSプログラム32に含まれている。そのため、CDCドライバ140のことを、「OS標準CDCドライバ」と呼んでもよい。CDCドライバ140は、カーネル領域300のうちの仮想シリアルポート130の下位であって、USBコントローラ150の上位の範囲に配置され、動作する。
【0037】
USBコントローラ150は、USBポート40へのUSBケーブル60の接続及び非接続の検出、USBポート40との間のデータの伝達等を制御するためのプログラムである。USBコントローラ150は、カーネル領域300のうちのCDCドライバ140の下位であって、USBポート40の上位の範囲に配置され、動作する。
【0038】
USBポート40は、
図1に示すように、USBケーブル60を介して周辺装置50と有線接続可能なポートである。USBポート40の一部はカーネル領域300の最下位の範囲に配置され、他の一部は外部(周辺装置)と対する形で配置される。
【0039】
図2の(a)に示すように、周辺装置50とUSBポート40とが通信可能な態様で有線接続されている場合、カーネル領域300内にCDCドライバ140がロードされ、それに伴ってカーネル領域300内に仮想シリアルポート130が生成されている。そして、ミドルウェア110によって、仮想シリアルポート130の状態がオープン状態に設定されている。これにより、アプリケーション100と周辺装置50とが相互に情報を伝達可能な状態が構築される。そのため、周辺装置50からアプリケーション100に情報を伝達させる場合(例えば、アプリケーション100が、周辺装置50から情報コードの読み取り結果を受信する場合)、周辺装置50、USBポート40、USBコントローラ150、CDCドライバ140、仮想シリアルポート130、API120、ミドルウェア110、アプリケーション100、の順に情報を伝達させることが可能になる。反対に、アプリケーション100から周辺装置50に情報が伝達される場合には、アプリケーション100、ミドルウェア110、API120、仮想シリアルポート130、CDCドライバ140、USBコントローラ150、USBポート40、周辺装置50の順に伝達させることが可能になる。即ち、
図2の(a)の時点では、周辺装置50とホスト機器10とが正常に接続されていると言うことができる。
【0040】
この例では、その後、
図2の(b)に示すように、周辺装置50とUSBポート40との接続が解除される。ここで、「周辺装置50とUSBポート40との接続が解除される」ことは、USBポート40と周辺装置50との接続が物理的に解除される(例えばUSBポート40からUSBケーブル60が物理的に引き抜かれる等)ことと、USBポート40と周辺装置50との接続が電気的に解除される(例えばUSBポート40とUSBケーブル60との接続が物理的には解除されていない状態で両者の接続が電気的に解除される等)ことと、の両方を含む。
【0041】
図2の(b)に示すように、周辺装置50とUSBポート40との接続が解除されると、OSが、USBポート40から周辺装置50が離脱したことを検出する。そして、OSは、カーネル領域300にロードされているCDCドライバ140のアンロードを実行する。
【0042】
この結果、
図2の(c)に示すように、カーネル領域300からCDCドライバ140がアンロードされる。これに伴い、OSは、カーネル領域300内に生成されていた仮想シリアルポート130を消滅させる。そして、OSは、CDCドライバ140がアンロードされたことを示すアンロード完了通知を、ミドルウェア110に対して送信する。アンロード完了通知は、イベント通知である。なお、他の例では、OSは、アンロード完了通知を、API120を介して(即ちAPI120経由で)ミドルウェア110に送信するようにしてもよい。
【0043】
ミドルウェア110は、アンロード完了通知を受信することにより、CDCドライバ140がアンロードされたことを検知する。ミドルウェア110は、CDCドライバ140がアンロードされたことを検知すると、オープン状態に設定していた仮想シリアルポート130(即ち、この時点で既に消滅済み)の状態をクローズ状態に移行させる。なお、この時点で仮想シリアルポート130は既に消滅しているため、ミドルウェア110は、オープン状態に設定していた仮想シリアルポート130の状態をクローズ状態に移行させることにより、仮想シリアルポート130を利用不可能な状態に切り替える。これにより、アプリケーション100と周辺装置50とが相互に情報を伝達不可能な状態が構築される。
【0044】
また、同時に、API120も、CDCドライバ140がアンロードされたことを示すエラーを検出する。API120は、例えば、OSからアンロード完了通知を受けることによって、エラーを検出する。API120がエラーを検出する手法はこれに限られず、任意の手法によってエラーを検出してもよい。例えば、他の例では、API120は、仮想シリアルポート130との間で定期的に行っている通信可能状態確認通信が失敗する場合にエラーを検出してもよい。API120は、エラーを検出すると、上位要素であるミドルウェア110にエラー通知を送信する。エラー通知は、CDCドライバ140がアンロードされたこと、及び、仮想シリアルポート130が消滅したことに関係する情報を含む。
【0045】
この場合、ミドルウェア110は、API120からエラー通知を受信するが、上位要素であるアプリケーション100に対してはエラー通知を送信しない。この結果、アプリケーション100は、仮想シリアルポート130が消滅したことを認識していない状態(即ち、仮想シリアルポート130が存在していると認識している状態)を維持する。
【0046】
そのため、アプリケーション100は、周辺装置50との間で情報の伝達を行うべき場合、正常時と同様にミドルウェア110に情報を伝達する。ただし、この場合、ミドルウェア110は、下位のAPI120に情報を伝達せず、アプリケーション100から受信した情報を、再び周辺装置50が接続され、仮想シリアルポート130が生成されるまで保持する。
【0047】
その後、
図3の(d)に示すように、周辺装置50とUSBポート40とが再接続されると、OSが、USBポート40に周辺装置50が再接続されたことを検出する。その場合、OSは、カーネル領域300において、CDCドライバ140の再ロードを実行する。
【0048】
その結果、
図3の(e)に示すように、カーネル領域300にCDCドライバ140が再ロードされる。即ち、カーネル領域300内にCDCドライバ140が読み込まれた状態に移行する。そして、OSは、カーネル領域300内に仮想シリアルポート130を生成する。また、OSは、CDCドライバ140が再ロードされたことを示すロード完了通知を、ミドルウェア110に対して送信する。ロード完了通知も、上記のアンロード完了通知と同様にイベント通知である。なお、他の例では、OSは、ロード完了通知を、API120を介して(即ちAPI120経由で)ミドルウェア110に送信するようにしてもよい。
【0049】
ミドルウェア110は、ロード完了通知を受信することにより、CDCドライバ140が再ロードされたことを検知する。ミドルウェア110は、CDCドライバ140が再ロードされたことを検知すると、クローズ状態だった仮想シリアルポート130(即ち、この時点では再度生成済み)の状態をオープン状態に移行させる。即ち、ミドルウェア110は、クローズ状態に設定していた仮想シリアルポート130の状態をオープン状態に移行させることにより、仮想シリアルポート130を利用可能な状態に復旧させる。これにより、アプリケーション100と周辺装置50とが相互に情報を伝達可能な状態が再び構築される。
【0050】
これに伴い、API120も、CDCドライバ140が再ロードされ、仮想シリアルポート130が再生成されたことを検出する。API120は、例えば、OSからロード完了通知を受けることによって、CDCドライバ140の再ロード及び仮想シリアルポート130の再生成を検出する。API120がCDCドライバ140の再ロード及び仮想シリアルポート130の再生成を検出する手法はこれに限られず、任意の手法によってエラーを検出してもよい。例えば、他の例では、API120は、仮想シリアルポート130との間で定期的に行っている通信可能状態確認通信が再度成功する場合に、CDCドライバ140の再ロード及び仮想シリアルポート130の再生成を検出してもよい。API120は、CDCドライバ140の再ロード及び仮想シリアルポート130の再生成を検出すると、上位要素であるミドルウェア110に復旧通知を送信する。復旧通知は、CDCドライバ140が再ロードされたこと、及び、仮想シリアルポート130が再生成されたことに関係する情報を含む。
【0051】
以上の処理が行われることにより、
図2の(a)と同様に、周辺装置50とホスト機器10とが正常に接続されている状態が復旧される。ミドルウェア110は、周辺装置50の離脱後にアプリケーション100から受信し、保持していた情報を、API120を介して周辺装置50に伝達させる。この際、上記のようにミドルウェア110が動作したために、アプリケーション100は、仮想シリアルポート130が一度消滅したことを認識することがない。そのため、アプリケーション100が、周辺装置50とUSBポート40との接続が解除されたことによるエラー(即ち仮想シリアルポート130が消滅したこと)に伴う異常動作をすることを抑制することができる。また、アプリケーション100において(即ち、ユーザにおいて)、異常解消のための操作等を行う必要もない。
【0052】
なお、
図2の(b)で周辺装置50が離脱した後、周辺装置50が再接続されるまでに所定期間(例えば30秒)以上が経過した場合等には、ミドルウェア110はアプリケーション100にエラー通知を送信する。この場合、アプリケーション100は仮想シリアルポート130が消滅したことを認識する。その場合は、アプリケーション100は、エラー時の動作を行う。
【0053】
上記の通り、本実施例では、ミドルウェア110が動作することにより、仮想シリアルポート130がオープン状態である間に、周辺装置50とUSBポート40との接続が解除されることに伴って、アプリケーション100が正常に動作しなくなる事態を抑制することができる。また、アプリケーション100において(即ち、ユーザにおいて)、異常解消のための操作等を行う必要もない。
【0054】
(ホスト機器10のCPU20が実行するポート管理処理;
図4)
次いで、
図4を参照して、CPU20がミドルウェア36(110)(
図1、
図2及び
図3参照)に従って実行するポート管理処理の内容を説明する。ここで、
図4の各ステップは、非同期的に行われ得ることに留意すべきである。例えば、後で説明するS22やS23等の処理が実行されている間に、S50やS60でYESと判断されるべき状況は発生し得る。
【0055】
ホスト機器10が起動されると、CPU20は、ミドルウェア36(110)に従って、S10,S20,S30,S40,S50,S60の各監視を開始する。
【0056】
S10では、CPU20は、アプリケーション100からオープン指示を受信することを監視する。オープン指示は、カーネル領域300に生成されている仮想シリアルポート130の状態をオープン状態(即ち、アプリケーション100と周辺装置50が相互に情報を伝達可能な状態)に移行させることをミドルウェア110に要求するための指示である。アプリケーション100は、周辺装置50との間で通信(周辺装置50へのデータの送信、又は、周辺装置50からのデータの受信)を開始すべき場合に、通信開始に先立って、ミドルウェア110にオープン指示を送信する。即ち、オープン指示は、通信開始指示であると理解してもよい。CPU20は、アプリケーション100からオープン指示を受信すると、S10でYESと判断し、S12に進む。
【0057】
S12では、CPU20は、周辺装置50が接続中であるか否かを判断する。CPU20は、USBポート40の状態を参照し、周辺装置50が有線接続されているか否かを判断する。S12の時点で、周辺装置50がUSBポート40に接続されていると判断される場合、CPU20は、S12でYESと判断し、S14に進む。S12でYESの場合、OSによってカーネル領域300内にCDCドライバ140がロードされ、カーネル領域300内に仮想シリアルポート130が生成されていることを意味する。
【0058】
S14では、CPU20は、カーネル領域300に生成されている仮想シリアルポート130の状態をオープン状態に移行する。
【0059】
続くS18では、CPU20は、周辺装置接続状態を確立する。周辺装置接続状態とは、アプリケーション100と周辺装置50とが、仮想シリアルポート130を介して相互に情報を伝達可能な状態である。S18を終えると、CPU20は、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0060】
一方、S12の時点において、周辺装置50がUSBポート40に接続されていないと判断される場合、CPU20は、S12でNOと判断し、S16に進む。S12でNOの場合、カーネル領域300内にCDCドライバ140がロードされておらず、カーネル領域300内に仮想シリアルポート130が生成されていないことを意味する。その場合、S16では、CPU20は、所定のエラー処理を行う。S16を終えると、CPU20は、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0061】
S20では、CPU20は、アプリケーション100からデータ送信リクエストを受信することを監視する。データ送信リクエストは、アプリケーション100が周辺装置50へのデータの送信を開始することを通知するための信号である。アプリケーション100は、周辺装置50にデータを送信すべき場合に、データの送信開始に先立ってミドルウェア110にデータ送信リクエストを送信する。アプリケーション100は、上述のオープン指示をミドルウェア110に送信した後で、データ送信リクエストをミドルウェア110に送信する。CPU20は、アプリケーション100からデータ送信リクエストを受信すると、S20でYESと判断し、S22に進む。
【0062】
S22では、CPU20は、データ送信処理(
図5参照)を開始する。データ送信処理の内容は、
図5を参照して後で詳しく説明する。CPU20は、S22でデータ送信処理を開始すると、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0063】
S30では、CPU20は、アプリケーション100からデータ受信リクエストを受信することを監視する。データ受信リクエストは、アプリケーション100が周辺装置50からのデータの受信を開始することを通知するための信号である。アプリケーション100は、周辺装置50からデータを受信すべき場合に、データの受信開始に先立ってミドルウェア110にデータ受信リクエストを送信する。アプリケーション100は、上述のオープン指示をミドルウェア110に送信した後で、データ受信リクエストをミドルウェア110に送信する。CPU20は、アプリケーション100からデータ受信リクエストを受信すると、S30でYESと判断し、S32に進む。
【0064】
S32では、CPU20は、データ受信処理(
図6参照)を開始する。データ受信処理の内容は、
図6を参照して後で詳しく説明する。CPU20は、S32でデータ送信処理を開始すると、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0065】
S40では、CPU20は、アプリケーション100からクローズ指示を受信することを監視する。クローズ指示は、カーネル領域300に生成されている仮想シリアルポート130の状態をクローズ状態(即ち、アプリケーション100と周辺装置50が相互に情報を伝達不可能な状態)に移行させることをミドルウェア110に要求するための指示である。アプリケーション100は、周辺装置50との間での通信(周辺装置50へのデータの送信、又は、周辺装置50からのデータの受信)を完了した場合に、ミドルウェア110にクローズ指示を送信する。即ち、クローズ指示は、通信終了指示であると理解してもよい。CPU20は、アプリケーション100からクローズ指示を受信すると、S40でYESと判断し、S42に進む。
【0066】
S42では、CPU20は、カーネル領域300に生成されている仮想シリアルポート130の状態をクローズ状態に移行する。S42を終えると、CPU20は、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0067】
S50では、CPU20は、OSからロード完了通知を受信することを監視する。上記の通り、ロード完了通知は、CDCドライバ140が再ロードされたことを示す通知である。上記の通り、OSは、周辺装置50とUSBポート40との接続が解除されることに伴って一旦アンロードされたCDCドライバ140が再ロードされると、ミドルウェア110に対してロード完了通知を送信する。CPU20は、OSからロード完了通知を受信すると、S50でYESと判断し、S52に進む。
【0068】
S52では、CPU20は、この時点でカーネル領域300に生成されている仮想シリアルポート130の状態をオープン状態に移行する。
【0069】
次いで、S54では、CPU20は、周辺装置接続状態を確立する。S54を終えると、CPU20は、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0070】
S60では、CPU20は、OSからアンロード完了通知を受信することを監視する。上記の通り、アンロード完了通知は、CDCドライバ140がアンロードされたことを示す通知である。上記の通り、OSは、周辺装置50とUSBポート40との接続が解除されることに伴って、CDCドライバ140をアンロードすると、ミドルウェア110に対してアンロード完了通知を送信する。CPU20は、OSからアンロード完了通知を受信すると、S60でYESと判断し、S62に進む。
【0071】
S62では、CPU20は、この時点で仮想シリアルポート130の状態がオープン状態であるか否かを判断する。仮想シリアルポート130が既に消滅済みか否かに関わらず、S62の時点で仮想シリアルポート130がオープン状態に設定されている場合、CPU20は、S62でYESと判断し、S64に進む。S64では、CPU20は、仮想シリアルポート130(即ち、この時点で既に消滅済み)の状態をクローズ状態に移行させる。S64を終えると、CPU20は、S66に進む。一方、S62の時点で仮想シリアルポート130が既にクローズ状態に設定されている場合、CPU20は、S62でNOと判断し、S64をスキップしてS66に進む。
【0072】
S66では、CPU20は、周辺装置離脱状態を確立する。周辺装置離脱状態とは、周辺装置50とUSBポート40との接続が解除されており、アプリケーション100と周辺装置50とが、仮想シリアルポート130を介して相互に情報を伝達不可能な状態である。S66を終えると、CPU20は、再びS10,S20,S30,S40,S50,S60の各監視に戻る。
【0073】
CPU20は、ホスト機器10の電源がオフされるまでの間、以上に説明した
図4のS10~S66の各処理を繰り返し実行する。なお、上記の通り、
図4の各ステップは、非同期的に行われ得る点に留意すべきである。
【0074】
(データ送信処理;
図5)
次いで、
図5を参照して、
図4のS22においてCPU20が開始するデータ送信処理の内容を説明する。
図5のデータ送信処理は、
図4のポート管理処理と並行して実行される。データ送信処理が開始されると(
図4のS22)、
図5のS72において、離脱確認タイマのカウントを開始する。ここで、「離脱確認タイマ」とは、USBポート40と周辺装置50との状態が周辺装置離脱状態である場合に、周辺装置50がUSBポート40から完全に離脱した状態(即ち、一時的な離脱ではない状態)であると判断するために必要な所定期間をカウントするタイマである。本実施例では、後で説明するように、離脱確認タイマのカウントを開始してから所定期間を経過した時点で、周辺装置離脱状態が継続している場合、CPU20は、周辺装置50がUSBポート40から完全に離脱した状態であると判断する。反対に、離脱確認タイマのカウントを開始してから所定期間を経過した時点で、周辺装置接続状態であれば、仮に、タイマのカウント開始から所定期間が経過するまでの間に周辺装置離脱状態であった期間が一部に存在したとしても、その離脱状態は、周辺装置50がUSBポート40から一時的に離脱したことによる離脱状態に過ぎない、と判断することができる。
【0075】
続くS74では、CPU20は、アプリケーション100から受信されたデータ(即ち、周辺装置50に送信されるべきデータ)の送信を開始する。具体的には、S74では、CPU20は、ミドルウェア110の下位要素であるAPI120に対してデータの送信を開始する。
【0076】
続くS76では、CPU20は、データの送信が成功したか否かを判断する。この時点で、送信すべきデータの送信が完了している場合、CPU20は、S76でYESと判断し、
図5のデータ送信処理を終了(正常終了)する。一方、この時点で、送信すべきデータの送信が未完了である場合、CPU20は、S76でNOと判断し、S77に進む。
【0077】
S77では、CPU20は、この時点における周辺装置50とUSBポート40との状態が、上記の「周辺装置離脱状態」であるか否かを判断する。CPU20は、USBポート40、及び、カーネル領域300の状態を確認し、周辺装置50とUSBポート40との接続状態が周辺装置離脱状態であるか否かを判断する。この時点において、周辺装置50とUSBポート40との間の状態が周辺装置離脱状態である場合、CPU20は、S77でYESと判断し、S78に進む。一方、この時点において、周辺装置50とUSBポート40との間の状態が周辺装置接続状態である場合、CPU20は、S77でNOと判断し、
図5のデータ送信処理をエラー終了する。S77でNOと判断される場合は、周辺装置50とUSBポート40との間の状態が周辺装置接続状態であるにもかかわらず、データの送信が成功しない場合であり、何らかのエラーが発生している可能性が高いと言える。
【0078】
S78では、CPU20は、S72で離脱確認タイマのカウントを開始してから、所定期間(タイムアウト期間。例えば30秒間)が経過したか否かを判断する。この時点で、所定期間が未経過の場合、CPU20は、S78でNOと判断し、S80に進む。即ち、S78でNOと判断される場合、周辺装置離脱状態は発生しているがまだ所定期間が未経過であり、その後、周辺装置接続状態に復帰する可能性もあるため、CPU20は、所定期間が経過するまではエラー終了を待つ、という処理を行うことになる。一方、この時点で、所定期間が既に経過している場合、CPU20は、S78でYESと判断し、
図5のデータ送信処理をエラー終了する。即ち、S78でNOと判断される場合は、周辺装置離脱状態が発生し、所定期間も経過したため、CPU20は、周辺装置50がUSBポート40から完全に離脱した状態(即ち、一時的な離脱ではない状態)であると判断し、
図5のデータ送信処理をエラー終了する。
【0079】
S80では、CPU20は、アプリケーション100から受信されたデータ(即ち、周辺装置50に送信されるべきデータ)の再送信を開始する。S80で再送信を開始すると、続いて、CPU20は再びS76の判断を行う。
【0080】
このように、CPU20は、
図5の処理が正常終了(S76でYES)するか、エラー終了(S77でNO、又はS78でYES)するまで、S76~S80の処理を繰り返し実行する。
【0081】
(データ受信処理;
図6)
次いで、
図6を参照して、
図4のS32においてCPU20が開始するデータ受信処理の内容を説明する。
図6のデータ受信処理も、
図4のポート管理処理と並行して実行される。データ受信処理が開始されると(
図4のS32)、
図5のS92において、離脱確認タイマのカウントを開始する。離脱確認タイマについては、上述の通りである。
【0082】
続くS94では、CPU20は、アプリケーション100によるデータの受信を開始する。具体的に言うと、S94では、CPU20は、アプリケーション100が受信すべきデータ(即ち、周辺装置50からAPI120を経由してミドルウェア110に伝達されたデータ)のアプリケーション100への送信を開始する。
【0083】
続くS96では、CPU20は、アプリケーション100によるデータの受信(即ち、アプリケーション100へのデータの送信)が成功したか否かを判断する。この時点で、アプリケーション100によるデータの受信が完了している場合、CPU20は、S96でYESと判断し、
図6のデータ受信処理を終了(正常終了)する。一方、この時点で、アプリケーション100によるデータの受信が未完了である場合、CPU20は、S96でNOと判断し、S97に進む。
【0084】
S97では、CPU20は、この時点における周辺装置50とUSBポート40との状態が、上記の「周辺装置離脱状態」であるか否かを判断する。CPU20は、USBポート40、及び、カーネル領域300の状態を確認し、周辺装置50とUSBポート40との接続状態が周辺装置離脱状態であるか否かを判断する。この時点において、周辺装置50とUSBポート40との間の状態が周辺装置離脱状態である場合、CPU20は、S97でYESと判断し、S98に進む。一方、この時点において、周辺装置50とUSBポート40との間の状態が周辺装置接続状態である場合、CPU20は、S97でNOと判断し、
図6のデータ受信処理をエラー終了する。S97でNOと判断される場合は、周辺装置50とUSBポート40との間の状態が周辺装置接続状態であるにもかかわらず、アプリケーション100によるデータの受信が成功しない場合であり、何らかのエラーが発生している可能性が高いと言える。
【0085】
S98では、CPU20は、S92で離脱確認タイマのカウントを開始してから、所定の期間(タイムアウト期間。例えば30秒間)が経過したか否かを判断する。この時点で、所定期間が未経過の場合、CPU20は、S98でNOと判断し、S100に進む。即ち、S98でNOと判断される場合、周辺装置離脱状態は発生しているがまだ所定期間が未経過であり、その後、周辺装置接続状態に復帰する可能性もあるため、CPU20は、所定期間が経過するまではエラー終了を待つ、という処理を行うことになる。一方、この時点で、所定期間が既に経過している場合、CPU20は、S98でYESと判断し、
図6のデータ受信処理をエラー終了する。即ち、S98でNOと判断される場合は、周辺装置離脱状態が発生し、所定期間も経過したため、CPU20は、周辺装置50がUSBポート40から完全に離脱した状態(即ち、一時的な離脱ではない状態)であると判断し、
図6のデータ受信処理をエラー終了する。
【0086】
S100では、CPU20は、アプリケーション100が受信すべきデータ(即ち、周辺装置50からAPI120を経由してミドルウェア110に伝達されたデータ)の再送信を開始する。S100で再送信を開始すると、続いて、CPU20は再びS96の判断を行う。
【0087】
このように、CPU20は、
図6の処理が正常終了(S96でYES)するか、エラー終了(S97でNO、又はS98でYES)するまで、S96~S100の処理を繰り返し実行する。
【0088】
以上、本実施例の機能実行システム2の構成、及び、ホスト機器10の動作について詳しく説明した。
【0089】
(比較例;
図7、
図8)
本実施例のホスト機器10の利点を明確に説明するために、
図7、
図8を参照して、本実施例のミドルウェア36(110)が存在しない場合のホスト機器10の動作を想定した比較例を説明する。
図7、
図8に示すように、比較例では、アプリケーション100とAPI120との間にミドルウェア110(
図2、
図3参照)が存在しない点が本実施例とは異なる。
【0090】
図7の(a)に示すように、周辺装置50とホスト機器10とが正常に接続されている場合においては、アプリケーション100が、仮想シリアルポート130の状態をオープン状態に設定することにより、アプリケーション100と周辺装置50とが相互に情報を伝達可能な状態が構築されている。
【0091】
その後、
図7の(b)に示すように、周辺装置50とUSBポート40との接続が解除されると、OSが、USBポート40の状態に基づいて、USBポート40から周辺装置50が離脱したことを検出する。そして、OSは、カーネル領域300にロードされているCDCドライバ140のアンロードを実行する。
【0092】
その結果、
図7の(c)に示すように、カーネル領域300からCDCドライバ140がアンロードされ、カーネル領域300内に生成されていた仮想シリアルポート130が消滅する。この場合、API120も、例えば、OSからアンロード完了通知を受けることによって、CDCドライバ140がアンロードされたことを示すエラーを検出する。API120は、API120は、エラーを検出すると、上位要素であるアプリケーション100にエラー通知を送信する。これにより、アプリケーション100は、異常が発生したことを認識する。
【0093】
この比較例では、その後、
図8の(d)に示すように、周辺装置50とUSBポート40とが再接続されると、
図8の(e)に示すように、カーネル領域300にCDCドライバ140が再ロードされる。そして、OSは、カーネル領域300内に仮想シリアルポート130を生成する。ただし、比較例では、この時点では、アプリケーション100は、異常発生を認識した状態(エラー状態)が解除されていない。エラー状態の解消のためには、ユーザが、アプリケーション100を再起動させ、アプリケーション100を操作して仮想シリアルポート130を再度オープン状態に設定する等、所定のエラー解消操作を行わなければならない。
【0094】
(本実施例の効果)
上記の比較例に対し、本実施例では、CPU20は、データ送信処理(
図5参照)及びデータ受信処理(
図6参照)が開始された際に、仮想シリアルポート130がオープン状態でなくなった場合(
図5のS70でNO、
図6のS90でNO)に、仮想シリアルポート130が再びオープン状態に戻る(即ち、
図4のS52が実行される)まで、S70及びS90の判断を繰り返し実行する。そして、CPU20は、この間にAPI120からエラー通知を受信した場合であっても、仮想シリアルポート130が再びオープン状態に戻る(即ち、
図4のS52が実行される)まで、エラー通知をアプリケーション100に送信することなく、仮想シリアルポート130をクローズ状態に設定したまま、S70及びS90の判断を繰り返し実行する(
図2の(c)参照)。これにより、アプリケーション100は、USBポート40と周辺装置50との接続が解除されたことに伴って、仮想シリアルポート130が一度消滅したことを認識しない。そのため、アプリケーション100がエラー(即ち仮想シリアルポート130が消滅したこと)に伴う異常動作をすることを抑制することができる。また、アプリケーション100において(即ち、ユーザにおいて)、異常解消のための操作等を行う必要もない。
【0095】
また、従来、アプリケーションが正常に動作できなくなることを抑制するためにカーネル領域で動作する専用のCDCドライバも開発されている。従来のCDCドライバは、USBポートと周辺装置との接続が解除される場合、仮想シリアルポートをクローズ状態に移行させる。その上で、この従来のCDCドライバは、アプリケーションが正常に動作できなくなることを避けるために、アプリケーションからの伝達情報に対して適切な応答を提供する。その後、周辺装置がUSBポートに再接続される場合に、仮想シリアルポートを再度オープン状態に切り替える。しかしながら、このような従来のCDCドライバは、カーネル領域で動作することを特徴とする。そのため、OSの更新等の影響を受けやすく、CDCドライバを提供する提供者(例えば周辺装置のベンダ等)は、当該バージョンのOSのための専用のCDCドライバをその都度準備する必要があった。また、ホスト機器の利用者も、その都度、専用のCDCドライバをコンピュータに記憶させておく必要がある。そのため、CDCドライバの提供者及びホスト機器の利用者の負担が大きかった。
【0096】
これに対し、上述の通り、本実施例のミドルウェア110(36)は、ユーザ領域200のうち、アプリケーション100とAPI120との間で動作する(
図2、
図3参照)。一般的に、OSが更新される場合であっても、アプリケーション100及びAPI120の仕様が変更されることは少ない。そのため、本実施例のミドルウェア110によると、ユーザアプリケーションが正常に動作できなくなることを抑制するためにカーネル領域で動作する従来のCDCドライバに比べて、OSの更新等に伴って、ミドルウェア110の提供者(例えば周辺装置50のベンダ等)が、当該バージョンのOSのための専用のミドルウェアをその都度準備しなければならない可能性は低い。また、ホスト機器10の利用者が、その都度、専用のプログラムをコンピュータに記憶させておく必要もない。そのため、本実施例では、ミドルウェア110を備えることにより、従来に比べて、プログラムの提供者及びホスト機器の利用者の負担を軽減し得る。
【0097】
また、上記の通り、本実施例では、CPU20は、OSからイベント通知であるアンロード通知を受信することにより、CDCドライバ140がアンロードされたことを検知する(
図4のS60参照)。そして、CPU20は、OSからイベント通知であるロード通知を受信することにより、CDCドライバ140が再ロードされたことを検知する(
図4のS50参照)。そのため、本実施例では、ミドルウェア110によって、CDCドライバのアンロード及び再ロードが適切なタイミングで検知され得る。
【0098】
本実施例と請求項の対応関係を説明しておく。本実施例のミドルウェア36が「コンピュータプログラム」の一例である。アンロード完了通知(
図4のS50参照)が、「第1のイベント通知」の一例である。ロード完了通知(S60参照)が、「第2のイベント通知」の一例である。
【0099】
(第2実施例)
図9、
図10を参照して、第2実施例について、第1実施例と異なる点を中心に説明する。本実施例の機能実行システム2も、その基本的構成は第1実施例と共通する。第1実施例では、CPU20が、OSからアンロード通知を受信することにより、CDCドライバ140がアンロードされたことを検知する(
図4のS60参照)。そして、CPU20は、OSからロード通知を受信することにより、CDCドライバ140が再ロードされたことを検知する(
図4のS50参照)。しかしながら、本実施例では、ミドルウェア36(110)に従って動作するCPU20は、OSから、USBポート40と周辺装置50の接続状態を示す情報を含む状態情報を定期的に取得し、取得された状態情報に基づいて、CDCドライバ140がアンロードされているか否か、及び、CDCドライバ140がロード(より詳しくは再ロード)されているか否か、を判断する点が第1実施例とは異なる。そのため、本実施例では、
図9、
図10に示すように、ポート管理処理の内容の一部も第1実施例とは異なる。
【0100】
(ホスト機器10のCPU20が実行するポート管理処理;
図9)
図9を参照して、本実施例のCPU20がミドルウェア36(110)(
図1、
図2及び
図3参照)に従って実行するポート管理処理の内容を説明する。ここで、
図9の各ステップも、
図4の各ステップと同様に、非同期的に行われ得ることに留意すべきである。ホスト機器10が起動されると、CPU20は、ミドルウェア36(110)に従って、
図9のS110,S120,S130,S140,S150の各監視を開始する。
【0101】
S110では、CPU20は、アプリケーション100からオープン指示を受信することを監視する。S110の処理の内容は
図4のS10と同様である。CPU20は、アプリケーション100からオープン指示を受信すると、S110でYESと判断し、S112に進む。
【0102】
S112では、CPU20は、周辺装置50が接続中であるか否かを判断する。CPU20は、USBポート40の状態を参照し、周辺装置50が有線接続されているか否かを判断する。S112の時点で、周辺装置50がUSBポート40に接続されていると判断される場合、CPU20は、S112でYESと判断し、S114に進む。S112でYESの場合、OSによってカーネル領域300内にCDCドライバ140がロードされ、カーネル領域300内に仮想シリアルポート130が生成されていることを意味する。
【0103】
S114では、CPU20は、カーネル領域300に生成されている仮想シリアルポート130の状態をオープン状態に移行する。
【0104】
続くS118では、CPU20は、周辺装置接続状態を確立する。
【0105】
続くS119では、CPU20は、CPU20は、ポーリングを開始する。ここでいう「ポーリング」とは、所定の処理タイミングの到来をトリガとして、定期的に後述の状態移行処理(
図10参照)を実行する一連の動作のことを言う。CPU20は、S119でポーリングを開始すると、再びS110,S120,S130,S140,S150の各監視に戻る。
【0106】
一方、S112の時点において、周辺装置50がUSBポート40に接続されていないと判断される場合、CPU20は、S112でNOと判断し、S116に進む。S112でNOの場合、カーネル領域300内にCDCドライバ140がロードされておらず、カーネル領域300内に仮想シリアルポート130が生成されていないことを意味する。その場合、S116では、CPU20は、所定のエラー処理を行う。S116を終えると、CPU20は、再びS110,S120,S130,S140,S150の各監視に戻る。
【0107】
S120では、CPU20は、ポーリングが開始されており、かつ、所定の処理タイミングが到来したか否かを判断する。ポーリングが開始されており(S119)、かつ、前回の状態移行処理(
図10参照)の実行から所定期間経過後の処理タイミングが到来すると、CPU20は、S120でYESと判断し、S122に進む。
【0108】
S122では、CPU20は、状態移行処理(
図10参照)を開始する。状態移行処理の内容は、
図10を参照して後で詳しく説明する。CPU20は、S122で状態移行処理を開始すると、再び、S110,S120,S130,S140,S150の各監視に戻る。
【0109】
S130では、CPU20は、アプリケーション100からデータ送信リクエストを受信することを監視する。S130の処理の内容は
図4のS20と同様である。CPU20は、アプリケーション100からデータ送信リクエストを受信すると、S130でYESと判断し、S122に進む。
【0110】
S132では、CPU20は、データ送信処理(
図5参照)を開始する。データ送信処理の内容は、第1実施例と同様であるため、詳しい説明を省略する。CPU20は、S132でデータ送信処理を開始すると、再びS110,S120,S130,S140,S150の各監視に戻る。
【0111】
S140では、CPU20は、アプリケーション100からデータ受信リクエストを受信することを監視する。S140の処理の内容は
図4のS30と同様である。CPU20は、アプリケーション100からデータ受信リクエストを受信すると、S140でYESと判断し、S142に進む。
【0112】
S142では、CPU20は、データ受信処理(
図6参照)を開始する。データ受信処理の内容も、第1実施例と同様であるため、詳しい説明を省略する。CPU20は、S1
42でデータ受信処理を開始すると、再びS110,S120,S130,S140,S150の各監視に戻る。
【0113】
S150では、CPU20は、アプリケーション100からクローズ指示を受信することを監視する。S150の処理の内容は
図4のS40と同様である。CPU20は、アプリケーション100からクローズ指示を受信すると、S150でYESと判断し、S152に進む。
【0114】
S152では、CPU20は、CPU20は、上記のポーリングを停止する。続くS154では、CPU20は、カーネル領域300に生成されている仮想シリアルポート130の状態をクローズ状態に移行する。S154を終えると、CPU20は、再びS110,S120,S130,S140,S150の各監視に戻る。
【0115】
(状態移行処理;
図10)
次いで、
図10を参照して、
図9のS122においてCPU20が開始する状態移行処理の内容を説明する。
図10の状態移行処理も、
図9のポート管理処理と並行して実行される。状態移行処理が開始されると(
図9のS122)、S160において、CPU20は、OSに対して所定のポーリング信号を送信し、OSから、USBポート40と周辺装置50との接続状態を示す情報を含む状態情報を取得する。ポーリング信号の送信先は、レジストリ、デバイスファイル、レジスタ等、状態情報を取得可能な場所であればよい。
【0116】
続くS164では、CPU20は、S160で取得された状態情報が、USBポート40に周辺装置50が接続されていることを示すか否かを判断する。状態情報が、USBポート40に周辺装置50が接続されていることを示す場合、CPU20は、S164でYESと判断し、S166に進む。S164でYESの場合、CPU20は、USBポート40に周辺装置50が接続されていることに伴い、カーネル領域300にCDCドライバ140がロードされていると判断する。一方、状態情報が、USBポート40に周辺装置50が接続されていないことを示す場合、CPU20は、S164でNOと判断し、S168に進む。S164でYESの場合、CPU20は、カーネル領域300においてCDCドライバ140がアンロードされていると判断する。
【0117】
S166では、CPU20は、この時点でカーネル領域300に生成されている仮想シリアルポート130の状態をオープン状態に移行する。続くS167では、CPU20は、周辺装置接続状態を確立する。S167を終えると、CPU20は、
図10の状態移行処理を終了する。
【0118】
S168では、CPU20は、この時点で仮想シリアルポート130が消滅済みか否かに関わらず、仮想シリアルポート130の状態をクローズ状態に移行させる。続くS169では、CPU20は、周辺装置離脱状態を確立する。S169を終えると、CPU20は、
図10の状態移行処理を終了する。
【0119】
上記の通り、本実施例では、CPU20は、ポーリングを実行することによって、定期的に
図10の状態移行処理を実行し、OSから、USBポート40と周辺装置50の接続状態を示す情報を含む状態情報を定期的に取得し、取得された状態情報に基づいて、CDCドライバ140がアンロードされているか否か、及び、CDCドライバ140がロード(より詳しくは再ロード)されているか否か、を判断する。本実施例による場合も、CDCドライバのアンロード及び再ロードが適切なタイミングで検知され得る。USBポート40に周辺装置50が接続されていないことを示す状態情報(S164でNO)が「第1の状態情報」の一例である。USBポート40に周辺装置50が接続されていることを示す状態情報(
図10のS164でYES)が「第2の状態情報」の一例である。
【0120】
(第3実施例)
第3実施例について、第1実施例と異なる点を中心に説明する。本実施例の機能実行システム2も、その基本的構成は第1実施例と共通する。また、CPU20が実行するポート管理処理(
図4)の内容も、基本的には第1実施例と共通する。しかしながら、本実施例では、OSから受信されるアンロード通知(
図4のS60参照)、ロード通知(
図4のS50参照)は、いずれも、イベント通知ではなく、イベント通知よりも処理優先度の高い割り込み通知である点において、第1実施例とは異なる。
【0121】
本実施例による場合、CPU20は、CDCドライバ140のアンロードの検知に続く各処理、及び、CDCドライバ140の再ロードの検知に続く各処理を優先的に実行し得る。本実施例のアンロード通知が「第1の割り込み通知」の一例であり、本実施例のロード通知が「第2の割り込み通知」の一例である。
【0122】
以上、本明細書で開示する技術の具体例を説明したが、これらは例示にすぎず、特許請求の範囲を限定するものではない。特許請求の範囲に記載の技術には以上に例示した具体例を様々に変形、変更したものが含まれる。また、本明細書または図面に説明した技術要素は、単独であるいは各種の組合せによって技術的有用性を発揮するものであり、出願時請求項記載の組合せに限定されるものではない。また、本明細書または図面に例示した技術は複数目的を同時に達成するものであり、そのうちの一つの目的を達成すること自体で技術的有用性を持つものである。
【符号の説明】
【0123】
2:機能実行システム
10:ホスト機器
20:CPU
30:メモリ
32:OSプログラム
34:アプリケーション
36:ミドルウェア
40:USBポート
50:周辺装置
60:USBケーブル
100:アプリケーション
110:ミドルウェア
120:API
130:仮想シリアルポート
140:CDCドライバ
150:USBコントローラ
200:ユーザ領域
300:カーネル領域