(57)【要約】【課題】  印刷ジョブを印刷中に、電波状況の影響により通信リンクが切断された場合に、印刷ジョブ内の印刷制御コマンドによるプリンタの不正印字等の誤動作を防止する。また、周辺装置の状態モニタ機能において、電波状況の影響により通信リンクが確立されているのか、切断されているのかが不明な状態の時にも、モニタが制御不能な状態に陥ることを防止する。【解決手段】  通信インタフェースを制御するポートモニタ（ＰＭ）によるインタフェース状態確認と、周辺装置を制御するランゲージモニタ（ＬＭ）によるインタフェース状態確認と、を行い、ＬＭによる状態確認結果に応じて周辺装置と通信する。また、通信が切断した場合には、送信バッファをクリアする。【選択図】  図１
2006331179.tif 000002
【特許請求の範囲】
【請求項１】
情報処理装置と、前記情報処理装置と通信インタフェースを介して接続される周辺装置を有する周辺装置制御システムであって、
前記情報処理装置は、
前記通信インタフェースの通信状態を確認する第１の確認手段を有し、前記通信インタフェースを制御する通信インタフェース制御手段と、
前記通信インタフェースの通信状態を確認する第２の確認手段を有し、前記周辺装置を制御する周辺装置制御手段を有し、
前記周辺装置制御手段は、前記第２の確認手段による前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信することを特徴とする周辺装置制御システム。
【請求項２】
通信インタフェースを介して周辺装置と通信する情報処理装置あって、
前記通信インタフェースの通信状態を確認する第１の確認手段を有し、前記通信インタフェースを制御する通信インタフェース制御手段と、
前記通信インタフェースの通信状態を確認する第２の確認手段を有し、前記周辺装置を制御する周辺装置制御手段と、を有し、
前記周辺装置制御手段は、前記第２の確認手段による前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信することを特徴とする情報処理装置。
【請求項３】
前記通信インタフェースは無線通信インタフェースであることを特徴とする請求項２記載の情報処理装置。
【請求項４】
前記第１の確認手段における前記通信インタフェースの通信状態を確認する処理と、前記第２の確認手段における前記通信インタフェースの通信状態を確認する処理は、確認処理が異なることを特徴とする請求項２または３記載の情報処理装置。
【請求項５】
前記通信インタフェース制御手段は、前記通信インタフェースの通信リンクを確立する確立手段を備えることを特徴とする請求項２から４のいずれかに記載の情報処理装置。
【請求項６】
前記通信インタフェース制御手段は、通信リンクが切断されている場合、前記確立手段により通信リンクを確立した後、前記周辺装置と通信することを特徴とする請求項５記載の情報処理装置。
【請求項７】
前記第１の確認手段が前記通信インタフェースの通信リンクの切断を検出した場合、前記周辺装置に送信するデータを記憶するバッファ内の未送信データを破棄することを特徴とする請求項２から６のいずれかに記載の情報処理装置。
【請求項８】
前記第２の確認手段は、前記通信インタフェースの通信状態が、正常、切断、再接続、不明の何れかであることを確認することを特徴とする請求項２から７のいずれかに記載の情報処理装置。
【請求項９】
情報処理装置は、前記第２の確認手段により、前記通信インタフェースの通信状態が正常であると検出された場合、前記周辺装置と通信することを特徴とする請求項８記載の情報処理装置。
【請求項１０】
前記周辺装置制御手段は、前記通信インタフェースが第１の通信インタフェースか、第２の通信インタフェースかを判定する判定手段を有することを特徴とする請求項２から９のいずれかに記載の情報処理装置。
【請求項１１】
前記周辺装置制御手段は、前記判定手段による判定に応じて、前記通信インタフェースの状態を管理することを特徴とする請求項１０記載の情報処理装置。
【請求項１２】
前記第２の確認手段は、前記判定手段による判定に応じて、前記通信インタフェースの通信状態を確認することを特徴とする請求項請求項１０または１１記載の情報処理装置。
【請求項１３】
通信インタフェースを介して周辺装置と通信する情報処理装置であって、前記通信インタフェースを制御する通信インタフェース制御手段と、前記周辺装置を制御する周辺装置制御手段とを有する情報処理装置の制御方法であって、
前記通信インタフェース手段は、前記通信インタフェースの通信状態を確認する第１の確認工程を有し、
前記周辺装置制御手段は、前記通信インタフェースの通信状態を確認する第２の確認工程を有し、
前記周辺装置制御手段は、前記第２の確認工程における前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信することを特徴とする情報処理装置の制御方法。
【請求項１４】
通信インタフェースを介して周辺装置と通信する情報処理装置により実行されるプログラムであって、
前記通信インタフェースを制御する通信インタフェース制御モジュールが、前記通信インタフェースの通信状態を確認する第１の確認工程を有し、
前記周辺装置を制御する周辺装置制御モジュールが、前記通信インタフェースの通信状態を確認する第２の確認工程を有し、
前記周辺装置制御モジュールは、前記第２の確認工程における前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信するための処理を行うことを特徴とするプログラム。
【請求項１５】
前記通信インタフェースは無線通信インタフェースであることを特徴とする請求項１４記載のプログラム。
【請求項１６】
前記第１の確認工程における前記通信インタフェースの通信状態を確認する処理と、前記第２の確認工程における前記通信インタフェースの通信状態を確認する処理は、確認処理が異なることを特徴とする請求項１４または１５記載のプログラム。
【請求項１７】
前記通信インタフェース制御モジュールは、前記通信インタフェースの通信リンクを確立する確立工程を備えることを特徴とする請求項１４から１６のいずれかに記載のプログラム。
【請求項１８】
前記通信インタフェース制御モジュールは、通信リンクが切断されている場合、前記確立工程において通信リンクを確立した後、前記周辺装置と通信するための処理を行うことを特徴とする請求項１７記載のプログラム。
【請求項１９】
前記第１の確認工程が前記通信インタフェースの通信リンクの切断を検出した場合、前記周辺装置に送信するデータを記憶するバッファ内の未送信データを破棄することを特徴とする請求項１４から１８のいずれかに記載のプログラム。
【請求項２０】
前記第２の確認工程は、前記通信インタフェースの通信状態が、正常、切断、再接続、不明の何れかであることを確認することを特徴とする請求項１４から１９のいずれかに記載のプログラム。
【請求項２１】
前記第２の確認工程により、前記通信インタフェースの通信状態が正常であると検出された場合、前記周辺装置と通信することを特徴とする請求項２０記載のプログラム。
【請求項２２】
前記周辺装置制御モジュールは、前記通信インタフェースが第１の通信インタフェースか、第２の通信インタフェースかを判定する判定工程を有することを特徴とする請求項１４から２１のいずれかに記載のプログラム。
【請求項２３】
前記周辺装置制御モジュールは、前記判定工程における判定に応じて、前記通信インタフェースの状態を管理することを特徴とする請求項２２記載のプログラム。
【請求項２４】
前記第２の確認工程は、前記判定工程における判定に応じて、前記通信インタフェースの通信状態を確認することを特徴とする請求項請求項２２または２３記載のプログラム。
【請求項２５】
通信インタフェースを介して周辺装置を通信する情報処理装置により実行されるプログラムであって、
請求項１４から２４のいずれかにおける前記通信インタフェースモジュール、もしくは、前記周辺装置制御モジュールの一方を有することを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置とプリンタ等の周辺装置を有する周辺装置制御システム、情報処理装置、情報処理装置の制御方法、プログラムに関する。
【背景技術】
【０００２】
従来、情報処理装置と周辺装置等の機器同士の接続インタフェースとして、例えば、パラレル、シリアル、Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ  （ＵＳＢ）、ＩＥＥＥ１３９４、Ｅｔｈｅｒｎｅｔ（登録商標）等の有線インタフェースが主に利用されていた。このような有線インタフェースにおいては情報処理装置と周辺装置とがその有線インタフェースを介して確実に接続されている為、通信が安定している。従って、ユーザの誤操作等でケーブルが抜かれる等しない限り通信が滞ったり、切断されたりすることはない。
【０００３】
従来利用されてきた有線インタフェースに加え、近年、Ｂｌｕｅｔｏｏｔｈ、無線ＬＡＮ（ＩＥＥＥ８０２．１１ａ／ｂ／ｇ等）、Ｗｉｒｅｌｅｓｓ  ＵＳＢ  Ｐｒｏｍｏｔｅｒ  Ｇｒｏｕｐが策定したＷｉｒｅｌｅｓｓ  ＵＳＢ等の新しい無線インタフェースが利用されるようになってきた。このような無線インタフェースにおいては、距離、障害物、周囲の電波状況等の影響を受ける為、有線インタフェースと比較して通信が不安定である。その結果、電波状況等の影響のために一時的に通信が滞ったり、通信が切断されたりする場合がある。
【０００４】
無線インタフェースを利用したシステムにおいて、例えばパーソナルコンピュータ（以下ではＰＣと略す）等の情報処理装置と、プリンタ等の周辺装置を、無線インタフェースの一例であるＢｌｕｅｔｏｏｔｈにより接続する例について考える。
【０００５】
このようなシステムでは、印刷ジョブの開始時にＢｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）を確立する。印刷ジョブの中では印刷画像データを表す印刷制御コマンドをプリンタに送り、印刷ジョブの終了時にＢｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）を切断する。このようなシステムにおいて、印刷制御コマンドをプリンタに送る送信処理中に、例えば無線通信の電波状況が悪くなり通信リンクが切断された場合、送信処理内で通信リンクを再確立するリカバリー処理を行っておらず、その印刷ジョブをエラー終了していた。
【０００６】
一般的なプリンタは、通常のスタンバイ状態であるニュートラルモード、印刷処理中の状態である印刷制御モード、プリンタのメンテナンス中であるメンテナンスモード等の各モードを備えている。プリンタはＰＣからの制御コマンドに応じてこれらの各モードを遷移する。各モード中は、ＰＣからプリンタに送られてくる制御コマンドを、プリンタがそのモード用の制御コマンドと解釈して制御する。
【０００７】
例えば、印刷制御モードにおいて印刷中に、電波状況が悪くなり通信リンクが切断された場合、誤動作を防止する為に、プリンタがプリンタ内のＢｌｕｅｔｏｏｔｈ通信を制御する手段（ハードウェアやファームウェア）を初期化する。プリンタ内部の処理も初期化してニュートラルモードに戻すような処理を行うプリンタが存在する。
【０００８】
情報処理装置上のアプリケーションが周辺装置（例えばプリンタ）の状態を確認して、その状態を表示するというような機能を備えるアプリケーションが存在する。以降において、このような機能を備えるアプリケーションをステータスモニタと呼ぶことにする。このステータスモニタは周辺装置からその状態を表す制御コマンド（以降、ステータス制御コマンドと呼ぶ）をある一定時間の間隔でポーリングしながら受信し、このステータス制御コマンドに従ってその状態表示を更新する。前記一定時間を例えば５秒程度に設定することで、ほぼリアルタイムにその周辺装置の状態表示を更新していくことができる。
【特許文献１】特開２００２−３１２２９８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
前述したように、無線インタフェースは有線インタフェースと比較して印刷中に通信が滞ったり切断されたりするケースが多いので、通信が切断される度に印刷ジョブがエラー終了されることが問題になるケースがある。このような問題点を解決する手段として、情報処理装置において、無線インタフェースを利用した印刷中に通信リンクが切断された場合に、通信リンクを再確立するリカバリー処理を行って、その印刷ジョブを継続する方法が考えられる。このような新しい印刷制御手段によって実現された印刷システムの場合、プリンタ側もこれに対応する為に、例えば、印刷制御モードにおいて印刷中に、電波状況が悪くなって通信リンクが切断された場合、プリンタがプリンタ内のＢｌｕｅｔｏｏｔｈ通信を制御する手段（ハードウェアやファームウェア）だけを初期化して、その後もニュートラルモードに移行せずに印刷制御モードを継続するような新しい処理を行う必要がある。
【００１０】
しかしながら、このような印刷制御を行う情報処理装置と、このような印刷制御に対応していない従来のプリンタから構成されるシステムの場合、印刷中に通信リンクが切断されるとプリンタ内部の処理を初期化してニュートラルモードに戻ってしまう。そのため、継続された印刷ジョブ内の印刷制御コマンドをプリンタが受信してもそれを正しく解釈することができず、例えば不正な印字を行う等の誤動作を引き起こしてしまうことがある。
【００１１】
本発明では、例えば、上記印刷制御を行う情報処理装置からの印刷ジョブを、上記印刷制御に対応していないプリンタで印刷中に、電波状況等の影響により通信リンクが切断されても、継続された印刷ジョブ内の印刷制御コマンドによってプリンタが不正な印字等の誤動作をしないようにする。
【００１２】
また、通信インタフェースとして、ＵＳＢ等の有線インタフェースを利用する場合と、Ｂｌｕｅｔｏｏｔｈ等の無線インタフェースを利用する場合が考えられる。有線インタフェースの場合、例えば５秒の間隔でポーリングしてステータス制御コマンドを受信し、周辺装置の状態表示を更新する場合、安定して状態表示を更新することが可能である。
【００１３】
しかしながら、無線インタフェースの場合、例えば５秒の間隔でポーリングして周辺装置の状態表示を更新する場合、例えば、電波状況が悪くなって通信リンクが確立されているのか、切断されているのかが不明な状態な場合がある。このような時に、ポーリングによるステータス制御コマンドの受信を試みると、無線インタフェースを制御するハードウェアやファームウェアが受信をリトライを繰り返す。そのため、ステータス制御コマンドを受信することができず、ステータスモニタに処理が返って来ない場合がある。この間、ステータスモニタが制御不能な状態に陥るという問題がある。
【００１４】
本発明では例えば、無線インタフェースを利用したステータスモニタにおいても、通信リンクが確立されているのか、切断されているのかが不明な状態の時にも、ステータスモニタが制御不能な状態に陥ることなく安定した状態を継続することができ、操作性を向上させる。
【００１５】
本発明の目的は、通信インタフェースの通信状態の変化による周辺装置の誤動作を防止することである。また、通信インタフェースの通信状態の変化により制御不能状態を防止することである。
【課題を解決するための手段】
【００１６】
本発明は、情報処理装置と、前記情報処理装置と通信インタフェースを介して接続される周辺装置を有する周辺装置制御システムであって、前記情報処理装置は、前記通信インタフェースの通信状態を確認する第１の確認手段を有し、前記通信インタフェースを制御する通信インタフェース制御手段と、前記通信インタフェースの通信状態を確認する第２の確認手段を有し、前記周辺装置を制御する周辺装置制御手段を有し、前記周辺装置制御手段は、前記第２の確認手段による前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信することを特徴とする周辺装置制御システムを提供する。
【００１７】
また、通信インタフェースを介して周辺装置と通信する情報処理装置あって、前記通信インタフェースの通信状態を確認する第１の確認手段を有し、前記通信インタフェースを制御する通信インタフェース制御手段と、前記通信インタフェースの通信状態を確認する第２の確認手段を有し、前記周辺装置を制御する周辺装置制御手段と、を有し、前記周辺装置制御手段は、前記第２の確認手段による前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信することを特徴とする情報処理装置を提供する。
【００１８】
また、通信インタフェースを介して周辺装置と通信する情報処理装置であって、前記通信インタフェースを制御する通信インタフェース制御手段と、前記周辺装置を制御する周辺装置制御手段とを有する情報処理装置の制御方法であって、前記通信インタフェース手段は、前記通信インタフェースの通信状態を確認する第１の確認工程を有し、前記周辺装置制御手段は、前記通信インタフェースの通信状態を確認する第２の確認工程を有し、前記周辺装置制御手段は、前記第２の確認工程における前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信することを特徴とする情報処理装置の制御方法を提供する。
【００１９】
また、通信インタフェースを介して周辺装置と通信する情報処理装置により実行されるプログラムであって、前記通信インタフェースを制御する通信インタフェース制御モジュールが、前記通信インタフェースの通信状態を確認する第１の確認工程を有し、前記周辺装置を制御する周辺装置制御モジュールが、前記通信インタフェースの通信状態を確認する第２の確認工程を有し、前記周辺装置制御モジュールは、前記第２の確認工程における前記通信インタフェースの通信状態の確認結果に応じて、前記周辺装置と通信するための処理を行うことを特徴とするプログラムを提供する。
【００２０】
また、上記プログラムの前記通信インタフェースモジュール、もしくは、前記周辺装置制御モジュールの一方を有することを特徴とするプログラムを提供する。
【発明の効果】
【００２１】
本発明によれば、通信インタフェースの通信状態の変化による周辺装置の誤動作を防止することができる。また、通信インタフェースの通信状態の変化により制御不能状態を防止することができる。
【発明を実施するための最良の形態】
【００２２】
以下、本発明を適用した好適な実施形態を、添付図面を参照しながら説明する。
【００２３】
以下の説明で引用される関数（情報）の内、特に詳しい説明を付加していないものに関しては、２００５年５月８日現在、Ｍｉｃｒｏｓｏｆｔ  Ｄｅｖｅｌｏｐｅｒ  Ｎｅｔｗｏｒｋ（ＭＳＤＮ）のサイトｈｔｔｐ：／／ｍｓｄｎ．ｍｉｃｒｏｓｏｆｔ．ｃｏｍ／ｌｉｂｒａｒｙ／ｄｅｆａｕｌｔ．ａｓｐでインターネット上で公開されている関数（情報）であるので、必要以上の説明を省略する。
【００２４】
以下において、ＵＳＢとはＵｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓの略であり、双方向通信が可能な公知のインタフェースであるので、その詳細説明は省略する。
【００２５】
以下において、Ｂｌｕｅｔｏｏｔｈは双方向通信が可能な公知の無線インタフェースであり、その仕様は次のインターネットサイトｈｔｔｐｓ：／／ｗｗｗ．ｂｌｕｅｔｏｏｔｈ．ｏｒｇ／で公開されているので、その詳細説明は省略する。なお、以下の説明では公開されていない関数も記述しているが、これらの関数は各コーリングシーケンスから推測される処理を行う関数の例である。
【００２６】
図１は本発明の情報処理装置及び周辺装置からなる周辺装置制御システムの構成を示すブロック図である。同図において、１は情報処理装置であり、一般的なパーソナルコンピュータ（以下、ＰＣと略す場合がある）で構成される。ＰＣ１は図２で後述するようなハードウェアで構成され、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）として米国マイクロソフト社のＷｉｎｄｏｗｓ（登録商標）  ＸＰがインストールされている。５はＵＳＢポートであり、ＵＳＢを制御するハードウェアで構成される。７はＢｌｕｅｔｏｏｔｈポートであり、Ｂｌｕｅｔｏｏｔｈ通信を制御するハードウェアで構成される。３はプリンタであり、カラーインクジェットプリンタで構成され、本実施形態における周辺装置である。プリンタ３はＸＹＺ社製のｋｍｍｎというモデル名のプリンタである。
【００２７】
尚、本発明における周辺装置としては、プリンタ、複写機、ファクシミリ、またはこれらの複合機などの画像形成装置、スキャナ、デジタルカメラであってもよい。プリンタ３は図３で後述するようなハードウェアで構成される。６はＵＳＢポートであり、ＵＳＢを制御するハードウェアで構成される。８はＢｌｕｅｔｏｏｔｈポートであり、Ｂｌｕｅｔｏｏｔｈ通信を制御するハードウェアで構成される。
【００２８】
プリンタ３はＰＣ１とＵＳＢインタフェース４ないしＢｌｕｅｔｏｏｔｈインタフェース９の何れかを介して接続されており、互いに双方向通信が可能である。
【００２９】
３６は図４で後述するランゲージモニタ（以降、ＬＭと略す場合がある）、３７は図４で後述するポートモニタ（以降、ＰＭと略す場合がある）である。それぞれＷｉｎｄｏｗｓ（登録商標）用のダイナミックリンクライブラリで構成される。３０はアプリケーションであり、Ｗｉｎｄｏｗｓ（登録商標）用の実行可能形式のファイル（＊．ＥＸＥ）で構成される。アプリケーション３０の一例としては、Ｗｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳ  に標準で同梱されているテキストエディタであるメモ帳／Ｎｏｔｅｐａｄ（Ｎｏｔｅｐａｄ．ｅｘｅ）のような印刷可能なアプリケーションが挙げられる。メモ帳のようなアプリケーション３０により印刷指示を行うと、ＰＣ１に接続されているプリンタ３用のドライバを選択して印刷を開始する。これにより、テキスト文書の内容をプリンタ３にて記録出力（印刷）することができる。
【００３０】
図２はＰＣ１のハードウェア構成の一例を表すブロック図である。ＰＣ１はランダムアクセスメモリ部（ＲＡＭ１２０１）、記憶部であるハードディスクドライブ部（ＨＤＤ１２０２）、入力部の一例であるキーボード部（ＫＢＤ１２０３）、制御部のＣＰＵ１２０４、表示部の一例である表示用ディスプレイ（ＬＣＤ１２０５）、通信制御部の一例であるネットワークボード（ＮＢ１２０７）、以上のＰＣ１の構成要素を互いに接続するバス１２０６から構成される。
【００３１】
ＮＢ１２０７にはＵＳＢインタフェース４用のＵＳＢポート５、Ｂｌｕｅｔｏｏｔｈインタフェース９用のＢｌｕｅｔｏｏｔｈポート７が含まれている。それぞれＵＳＢ、Ｂｌｕｅｔｏｏｔｈの通信を制御する。なお、記憶部は、可搬性ＣＤ−ＲＯＭまたは内部据付のＲＯＭなどであってもよい。図１に示すＰＣ１の各モジュール（アプリケーション３０、ＬＭ３６、ＰＭ３７）は、ＨＤＤ１２０２に記憶され、必要に応じてＲＡＭ１２０１に読み出されてＣＰＵ１２０４により実行される。これにより、ＣＰＵ１２０４が、図１に示す各モジュールの機能を実現する。
【００３２】
図３はプリンタのハードウェア構成を表すブロック図である。同図において、１５はマイクロプロセッサ等から構成されるＣＰＵであり、中央処理装置として、ＲＯＭ１６に記憶されているプログラムに従って、ＲＡＭ１７、通信部１８、記録部１９を制御する。ＲＯＭ１６にはプリンタドライバ５０（図４で後述する）の制御に従ってプリンタ３が記録出力（印刷）処理を行うプログラムが記憶されている。ＲＡＭ１７は主にＰＣ１から送られて、それをもとに記録部１９によって印刷される印字データが一時的に記憶される。通信部１８にはＵＳＢインタフェース４用のＵＳＢポート６、Ｂｌｕｅｔｏｏｔｈインタフェース９用のＢｌｕｅｔｏｏｔｈポート８が含まれており、それぞれＵＳＢ、Ｂｌｕｅｔｏｏｔｈの通信を制御する。記録部１９は、インクジェット方式等により印刷を行う。
【００３３】
印刷時には、アプリケーション上での印刷操作によって、アプリケーションにより開かれているファイルの表示内容（画像データ）が、ＥＭＦ形式のスプールファイルとしてＰＣ１のＨＤＤ１２０２に一時的に格納される。このＥＭＦ形式のスプールファイルは、プリンタドライバ５０を介してプリンタ３制御用コマンドを含む印字データに変換された後、ＵＳＢインタフェース４ないしＢｌｕｅｔｏｏｔｈインタフェース９の何れかを介してプリンタ３に送られる。プリンタ３にて受信された印字データは、記録部１９によって印字用パルスに変換されて、記録紙上に印刷される。プリンタ３は、図４で後述するプリンタドライバ５０によって生成されてＰＣ１から送られてくる印刷制御コマンドに従って印刷制御を行う。尚、前記印字データは印刷制御コマンドの内の１つである。
【００３４】
プリンタ３が起動すると、まず通常のスタンバイ状態を表すニュートラルモードに移行する。このニュートラルモードにおいて、プリンタ３が印刷の開始を表す印刷開始コマンドを受信すると印刷制御モードに移行する。そして、以降の処理において印刷終了コマンドを受信する迄の間は印刷制御モードとして、ＰＣ１から送られてくるデータを印刷制御コマンドと判断して処理を行う。
【００３５】
ニュートラルモードにおいて、メンテナンス処理を行う各メンテナンスコマンドをプリンタ３が受信すると、メンテナンスモードに移行する。その後そのメンテナンスコマンドに従って適切なメンテナンス処理を行い、メンテナンス処理が終了した後ニュートラルモードに戻る。メンテナンス処理の例としては、記録ヘッドのクリーニング等が挙げられる。
【００３６】
通信部１８は、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬ（Ａｓｙｎｃｈｒｏｎｏｕｓ  Ｃｏｎｎｅｃｔｉｏｎ  Ｌｅｓｓ）とＨＣＲＰ（Ｈａｒｄｃｏｐｙ  Ｃａｂｌｅ  Ｒｅｐｌａｃｅｍｅｎｔ  Ｐｒｏｆｉｌｅ））が確立されている状態において、例えば無線通信の電波状況が悪くなって通信リンクが切断された場合、誤動作を防止する為にニュートラルモードに移行する。従って、例えば印刷制御モードで印刷中に無線通信の電波状況が悪くなって通信リンクが切断された場合、印刷制御モードからニュートラルモードに移行する。この状態において、もし無線通信の電波状況が良好となって通信リンクを再確立し、印刷制御コマンドが送られてくると、プリンタ３はニュートラルモードに移行してしまっているので、印刷制御コマンドを解釈することができない。そのため、送られてきた印刷制御コマンドのデータの内容によっては、不正印字等の誤動作を引き起こすような結果に至る。
【００３７】
図４は、ＰＣ１におけるプリンタドライバの構成を表すブロック図である。同図において、プリンタドライバ５０はＰＣ１にインストールされているドライバであり、３３〜３８で示す複数のモジュールを備えている。アプリケーション３０は印刷指令が可能なアプリケーションソフトウェアであり、例えば、Ｗｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳ  に標準で同梱されているテキストエディタであるメモ帳／Ｎｏｔｅｐａｄ（Ｎｏｔｅｐａｄ．ｅｘｅ）や、図３２で後述するようなステータスモニタ等に相当する。３１はＧＤＩ（Ｇｒａｐｈｉｃｓ  Ｄｅｖｉｃｅ  Ｉｎｔｅｒｆａｃｅ）であり、Ｗｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳの一部である。３２はプリンタキューで、Ｗｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのスプーラ（Ｓｐｏｏｌｅｒ）の一部であり、印刷ジョブをキューイングする。
【００３８】
次にプリンタドライバ５０の構成を説明する。３３はプリントプロセッサであり、印刷レイアウトの変更や印刷画像の特殊処理を行う。３４はグラフィックスドライバであり、プリンタドライバ５０の画像処理のコアとして動作する。グラフィックスドライバ３４は、ＧＤＩ３１から送られて来る描画命令に基づき印刷用の画像処理を行い、印刷制御コマンドを作成する。３５はＵＩモジュールであり、プリンタドライバ５０のユーザインタフェースの提供及び制御を行う。３６は図１で説明したランゲージモニタ（ＬＭ）であり、データの通信インタフェース（Ｉ／Ｆ）としてデータの送受信を制御する。３７は図１で説明したポートモニタ（ＰＭ）である。ＰＭ３７は、ＬＭ３６から送られてくるデータを適切なポートに対して送信したり、プリンタ３から送られてくるデータを、クラスドライバ３８を介して受信したりする。クラスドライバ３８は、最もポートに近いローレベルのモジュールである。本実施形態で説明するクラスドライバ３８は、ＵＳＢのＰｒｉｎｔｅｒ  Ｃｌａｓｓのスタックを制御するドライバ、ＢｌｕｅｔｏｏｔｈのＨａｒｄｃｏｐｙ  Ｃａｂｌｅ  Ｒｅｐｌａｃｅｍｅｎｔ  Ｐｒｏｆｉｌｅ（ＨＣＲＰ）のスタックを制御するドライバに相当し、ポート（ＵＳＢポート５、Ｂｌｕｅｔｏｏｔｈポート７）を制御する。
【００３９】
図２７はＬＭ３６がエクスポートしている関数の定義を表す図である。ここでは本実施形態を説明する上で必要な部分に関して説明する。
【００４０】
ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数は、印刷ジョブの開始時にＳｐｏｏｌｅｒからコールされる関数である。
【００４１】
ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数は、印刷開始コマンド、印刷制御コマンド、印刷終了コマンド等のデータをプリンタ３に送信する時に、Ｓｐｏｏｌｅｒからコールされる関数である。この関数の引数ｐＢｕｆｆｅｒにはプリンタ３に送信するデータが、引数ｃｂＢｕｆにはこのデータのサイズ（単位：バイト）が、それぞれセットされる。ＬＰＤＷＯＲＤは符号なしダブルワード（ｕｎｓｉｇｎｅｄ  ｌｏｎｇ、３２ビット）を指すポインタである。引数ｐｃｂＷｒｉｔｔｅｎには、この関数がリターンされた時にプリンタ３に実際に送信されたデータのサイズがセットされて返される。また、ｐｃｂＷｒｉｔｔｅｎは符号なしダブルワードのポインタ変数（＊ｐｃｂＷｒｉｔｔｅｎのアドレスを表す変数）であり、＊ｐｃｂＷｒｉｔｔｅｎで参照できるデータはｐｃｂＷｒｉｔｔｅｎのアドレスにあるメモリの値を表す。
【００４２】
ＬＭ＿ＲｅａｄＰｏｒｔ（）関数は、ステータスモニタがプリンタ３からステータス制御コマンド等を取得する時にＳｐｏｏｌｅｒからコールされる関数である。この関数の引数ｐＢｕｆｆｅｒには、この関数がリターンされた時にＰＣ１が実際に取得したプリンタ３から送られてきたデータがセットされ、引数ｐｃｂＲｅａｄにはこのデータのサイズがセットされて返される。また、ｐｃｂＲｅａｄは符号なしダブルワードのポインタ変数（＊ｐｃｂＲｅａｄのアドレスを表す変数）であり、＊ｐｃｂＲｅａｄで参照できるデータはｐｃｂＲｅａｄのアドレスにあるメモリの値を表す。
【００４３】
ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数は、印刷ジョブの終了時にＳｐｏｏｌｅｒからコールされる関数である。
【００４４】
図２８はＰＭ３７がエクスポートしている関数の定義を表す図である。ここでは本実施形態を説明する上で必要な部分に関して説明する。
【００４５】
ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数は、印刷ジョブの開始時にＬＭ３６からコールされる関数である。
【００４６】
ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数は、印刷開始コマンド、印刷制御コマンド、印刷終了コマンド等のデータをプリンタ３に送信する時に、ＬＭ３６からコールされる関数である。この関数の引数ｐＢｕｆｆｅｒにはプリンタ３に送信するデータが、引数ｃｂＢｕｆにはこのデータのサイズ（単位：バイト）が、それぞれセットされる。ＬＰＤＷＯＲＤは符号なしダブルワード（ｕｎｓｉｇｎｅｄ  ｌｏｎｇ、３２ビット）を指すポインタである。引数ｐｃｂＷｒｉｔｔｅｎには、この関数がリターンされた時にプリンタ３に実際に送信されたデータのサイズがセットされて返される。また、ｐｃｂＷｒｉｔｔｅｎは符号なしダブルワードのポインタ変数（＊ｐｃｂＷｒｉｔｔｅｎのアドレスを表す変数）であり、＊ｐｃｂＷｒｉｔｔｅｎで参照できるデータはｐｃｂＷｒｉｔｔｅｎのアドレスにあるメモリの値を表す。
【００４７】
ＰＭ＿ＲｅａｄＰｏｒｔ（）関数は、ステータスモニタがプリンタ３からステータス制御コマンド等を取得する時にＬＭ３６からコールされる関数である。この関数の引数ｐＢｕｆｆｅｒには、この関数がリターンされた時にＰＣ１が実際に取得したプリンタ３から送られてきたデータがセットされ、引数ｐｃｂＲｅａｄにはこのデータのサイズがセットされて返される。また、ｐｃｂＲｅａｄは符号なしダブルワードのポインタ変数（＊ｐｃｂＲｅａｄのアドレスを表す変数）であり、＊ｐｃｂＲｅａｄで参照できるデータはｐｃｂＲｅａｄのアドレスにあるメモリの値を表す。
【００４８】
ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数は印刷ジョブの終了時にＬＭ３６からコールされる関数である。
【００４９】
図２９はＰＭ３７がエクスポートしている関数とこの関数が使用する本実施形態で新たに提案する定数の定義を表す図である。ここでは本発明を説明する上で必要な部分に関して説明する。
【００５０】
ＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数は、デバイス（プリンタ３）用のクラスドライバ３８を制御してデバイス（プリンタ３）の通信インタフェース（ＵＳＢインタフェース４、Ｂｌｕｅｔｏｏｔｈインタフェース９）の状態を取得したり、Ｉ／Ｏを制御したりする時に、ＬＭ３６からコールされる関数である。この関数の引数ＣｏｎｔｒｏｌＩＤにはＩ／Ｏ  ｃｏｎｔｒｏｌ  ｃｏｄｅがセットされ、各Ｉ／Ｏ  ｃｏｎｔｒｏｌ  ｃｏｄｅに割り当てられている制御が行われる。ＬＰＷＳＴＲはＮＵＬＬで終わるＵｎｉｃｏｄｅ文字列を指すポインタである。引数ｌｐＯｕｔＢｕｆｆｅｒにはこの関数がリターンされた時に、取得した情報等がセットされて返される。ｌｐＯｕｔＢｕｆｆｅｒはＮＵＬＬで終わるＵｎｉｃｏｄｅ文字列のポインタ変数（＊ｌｐＯｕｔＢｕｆｆｅｒのアドレスを表す変数）であり、＊ｌｐＯｕｔＢｕｆｆｅｒで参照できるデータはｌｐＯｕｔＢｕｆｆｅｒのアドレスにあるメモリの値を表す。
【００５１】
ＩＯＣＴＬ＿ＢＬＵＥＴＯＯＴＨ＿ＣＯＭＭＵＮＩＣＡＴＩＯＮは本実施形態で新たに提案するＩ／Ｏ  ｃｏｎｔｒｏｌ  ｃｏｄｅの定義であり、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の状態を確認する制御が割り当てられている。ＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ、ＢＬＵＥＴＯＯＴＨ＿ＲＥＣＯＶＥＲＥＤ、ＢＬＵＥＴＯＯＴＨ＿ＤＩＳＣＯＮＮＥＣＴＥＤ、ＢＬＵＥＴＯＯＴＨ＿ＵＮＫＮＯＷＮも本実施形態で新たに提案するＩ／Ｏ  ｃｏｎｔｒｏｌ  ｃｏｄｅの定義であり、それぞれ、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが次のような状態であることを表す。
ＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ：Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態
ＢＬＵＥＴＯＯＴＨ＿ＲＥＣＯＶＥＲＥＤ：Ｂｌｕｅｔｏｏｔｈ通信がリカバリーされ、通信リンクが確立されて正常な状態に復帰した状態
ＢＬＵＥＴＯＯＴＨ＿ＤＩＳＣＯＮＮＥＣＴＥＤ：Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが切断されている状態
ＢＬＵＥＴＯＯＴＨ＿ＵＮＫＮＯＷＮ：Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されているのか切断されているのかが不明な状態
図３０はＵＳＢ  ＨＷ  （Ｓｔａｃｋ）がエクスポートしている関数の定義を表す図である。尚、図５、図２６ではこれらの関数がＰＭ３７からコールされるように図示されているが、実際にはこれらの図で省略しているクラスドライバ３８からコールされる。
【００５２】
ＵＳＢ＿Ｓｅｎｄ（）関数は、印刷開始コマンド、印刷制御コマンド、印刷終了コマンド等のデータをプリンタ３に送信する時にコールされる関数である。この関数の引数ｐＢｕｆｆｅｒにはプリンタ３に送信するデータがセットされ、引数ｃｂＢｕｆにはこのデータのサイズ（単位：バイト）がセットされる。
【００５３】
ＬＰＤＷＯＲＤは符号なしダブルワード（ｕｎｓｉｇｎｅｄ  ｌｏｎｇ、３２ビット）を指すポインタである。引数ｐｃｂＷｒｉｔｔｅｎには、この関数がリターンされた時にプリンタ３に実際に送信されたデータのサイズがセットされて返される。また、ｐｃｂＷｒｉｔｔｅｎは符号なしダブルワードのポインタ変数（＊ｐｃｂＷｒｉｔｔｅｎのアドレスを表す変数）であり、＊ｐｃｂＷｒｉｔｔｅｎで参照できるデータはｐｃｂＷｒｉｔｔｅｎのアドレスにあるメモリの値を表す。
【００５４】
ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数は、ステータスモニタがプリンタ３からステータス制御コマンド等を取得する時にコールされる関数である。この関数の引数ｐＢｕｆｆｅｒには、この関数がリターンされた時にＰＣ１が実際に取得したプリンタ３から送られてきたデータがセットされ、引数ｐｃｂＲｅａｄにはこのデータのサイズがセットされて返される。また、ｐｃｂＲｅａｄは符号なしダブルワードのポインタ変数（＊ｐｃｂＲｅａｄのアドレスを表す変数）であり、＊ｐｃｂＲｅａｄで参照できるデータはｐｃｂＲｅａｄのアドレスにあるメモリの値を表す。
【００５５】
図３１はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）がエクスポートしている関数の定義を表す図である。尚、図６、図７、図２４、図２５ではこれらの関数がＰＭ３７からコールされるように図示されているが、実際にはこれらの図で省略しているクラスドライバ３８からコールされる。
【００５６】
ＢＴ＿Ｓｅｎｄ１（）関数、ＢＴ＿Ｓｅｎｄ２（）関数は、印刷開始コマンド、印刷制御コマンド、印刷終了コマンド等のデータをプリンタ３に送信する時にコールされる関数である。これらの関数の引数ｐＢｕｆｆｅｒにはプリンタ３に送信するデータがセットされ、引数ｃｂＢｕｆにはこのデータのサイズ（単位：バイト）がセットされる。ＬＰＤＷＯＲＤは符号なしダブルワード（ｕｎｓｉｇｎｅｄ  ｌｏｎｇ、３２ビット）を指すポインタである。引数ｐｃｂＷｒｉｔｔｅｎには、これらの関数がリターンされた時にプリンタ３に実際に送信されたデータのサイズがセットされて返される。また、ｐｃｂＷｒｉｔｔｅｎは符号なしダブルワードのポインタ変数（＊ｐｃｂＷｒｉｔｔｅｎのアドレスを表す変数）であり、＊ｐｃｂＷｒｉｔｔｅｎで参照できるデータはｐｃｂＷｒｉｔｔｅｎのアドレスにあるメモリの値を表す。
【００５７】
ＢＴ＿Ｒｅｃｅｉｖｅ１（）関数、ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数は、ステータスモニタがプリンタ３からステータス制御コマンド等を取得する時にコールされる関数である。これの関数の引数ｐＢｕｆｆｅｒには、この関数がリターンされた時にＰＣ１が実際に取得したプリンタ３から送られてきたデータがセットされ、引数ｐｃｂＲｅａｄにはこのデータのサイズがセットされて返される。また、ｐｃｂＲｅａｄは符号なしダブルワードのポインタ変数（＊ｐｃｂＲｅａｄのアドレスを表す変数）であり、＊ｐｃｂＲｅａｄで参照できるデータはｐｃｂＲｅａｄのアドレスにあるメモリの値を表す。
【００５８】
ＢＴ＿Ｃｏｎｎｅｃｔ（）関数は、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）を確立する時にコールされる関数である。ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数は、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）を切断する時にコールされる関数である。
【００５９】
ＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数は、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の状態を確認する時にコールされる関数である。
【００６０】
図５はＵＳＢインタフェース４を介して印刷を行った時の関数フローを表す図である。同図では関数成功時に成功を表すＴＲＵＥを返すリターン処理やエラー時の処理の一部、及びクラスドライバ３８における処理を省略している。
【００６１】
最上段は処理の実行元を表しており、Ｕｓｅｒはユーザにおける操作（処理）、Ｓｐｏｏｌｅｒは図４で説明したＷｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのＳｐｏｏｌｅｒにおける処理、ＬＭはＬＭ３６における処理、ＰＭはＰＭ３７における処理を表す。また、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）はＵＳＢポート５を構成するハードウェアまたはファームウェアのスタックにおける処理をそれぞれ表す。例えば、Ｕｓｅｒの列を見ると「ＵＳＢでＰＣとプリンタを接続」というようなユーザの操作（処理）が示されている。この例のように、それぞれの列がその列の実行元における処理を表す。
【００６２】
同図において、ユーザがＰＣ１とプリンタ３をＵＳＢインタフェース４を介して接続した時（Ｓ５０１）、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）においてＵＳＢの接続が完了されて送受信可能な状態になる（Ｓ５０２）。ユーザが印刷を開始すると（Ｓ５０３）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行される（Ｓ５０４）。
【００６３】
ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行されると（Ｓ５０４）、Ｓｐｏｏｌｅｒは、ＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ５０５）。ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ５０６）、ＯＳの標準関数であるＳｅｔＣｏｍｍＴｉｍｅｏｕｔｓ（）関数をコールして、ＵＳＢ通信のＷｒｉｔｅ／Ｒｅａｄのタイムアウト時間を次のように設定する（Ｓ５３３）。
Ｗｒｉｔｅのタイムアウト時間：  ３秒
Ｒｅａｄのタイムアウト時間：  １秒
ステップＳ５３３の後、ＬＭ３６は、ＰＭ３７内のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ５０７）。ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ５０８）、ＰＭ３７は、必要に応じて適切な処理を行う（Ｓ５０９）。ここでは、例えばＰＭ３７内の変数の初期化や、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）の初期化等が行われるが、その詳細説明は省略する。ステップＳ５０９の後、ＰＭ３７からＬＭ３６にＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数がリターンされ（Ｓ５１０）、ＬＭ３６からＳｐｏｏｌｅｒに、ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数がリターンされる（Ｓ５１１）。そして、Ｓｐｏｏｌｅｒは、ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数内においてＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５１２）。この時、図２７に示すｐＢｕｆｆｅｒに前記印刷開始コマンドが含まれていて、ｃｂＢｕｆにそのサイズ（単位：バイト）がセットされている。
【００６４】
ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が実行されると（Ｓ５１３）、ＬＭ３６は、ＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５１４）。ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が実行されると（Ｓ５１５）、ＰＭ３７は、ＵＳＢ  ＨＷ（Ｓｔａｃｋ）内のＵＳＢ＿Ｓｅｎｄ（）関数をコールする（Ｓ５１６）。
【００６５】
ＵＳＢ＿Ｓｅｎｄ（）関数が実行されると（Ｓ５１７）、図１５で後述する処理を行い（Ｓ５１８）、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）からＰＭ３７に、このＵＳＢ＿Ｓｅｎｄ（）関数がリターンされる（Ｓ５１９）。このＵＳＢ＿Ｓｅｎｄ（）関数が成功した場合は、プリンタ３が前記印刷開始コマンドを受信して印刷制御モードに移行する。ステップＳ５１９の後、ＰＭ３７からＬＭ３６に、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数がリターンされ（Ｓ５２０）、ＬＭ３６からＳｐｏｏｌｅｒ  に、ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数がリターンされる（Ｓ５２１）。その後、Ｓｐｏｏｌｅｒは、印刷画像データを表す印刷制御コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５２２）。これ以降において、実行されるＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の処理はステップＳ５１３で説明した処理と同様であるので、ここではその説明を省略する。
【００６６】
ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した場合、プリンタ３が前記印刷制御コマンドを受信してそのコマンドに従って記録出力（印刷）を行う。印刷画像データを表す印刷制御コマンドの送信が全て完了すると、Ｓｐｏｏｌｅｒは、前記印刷終了コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５２３）。ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した場合、プリンタ３が前記印刷終了コマンドを受信して、ニュートラルモードに移行する。そして、ＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ５２４）。ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ５２５）、ＬＭ３６はＰＭ３７内のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ５２６）。ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ５２７）、ＰＭ３７は必要に応じて適切な処理を行う（Ｓ５２８）。ここでは、例えばエラー終了時の初期化処理等が行われるが、その詳細説明は省略する。ステップＳ５２８の後、このＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がＬＭ２６にリターンされ（Ｓ５２９）、ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がＳｐｏｏｌｅｒにリターンされ（Ｓ５３０）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数を終了する（Ｓ５３１）。印刷が正常に終了した場合、その後もＵＳＢ  ＨＷ  （Ｓｔａｃｋ）において送受信可能な状態が維持される（Ｓ５３２）。
【００６７】
図６はＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の従来例の関数フローを表す図である。同図では関数成功時に成功を表すＴＲＵＥを返すリターン処理やエラー時の処理の一部、及びクラスドライバ３８における処理を省略している。同図において、最上段は処理の実行元を表しており、Ｕｓｅｒはユーザにおける操作（処理）、Ｓｐｏｏｌｅｒは図４で説明したＷｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのＳｐｏｏｌｅｒにおける処理、ＬＭはＬＭ３６における処理、ＰＭはＰＭ３７における処理、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）はＢｌｕｅｔｏｏｔｈポート７を構成するハードウェアまたはファームウェアのスタックにおける処理をそれぞれ表す。例えば、Ｕｓｅｒの列を見ると「プリンタの電源をオン」というようなユーザの操作（処理）が示されている。この例のように、それぞれの列がその列の実行元における処理を表す。
【００６８】
同図において、ユーザがプリンタの電源をオンにした時（Ｓ６０１）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識される（Ｓ６０２）。ユーザが印刷を開始すると（Ｓ６０３）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行される（Ｓ６０４）。ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行されると（Ｓ６０４）、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ６０５）。ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ６０６）、ＬＭ３６はＯＳの標準関数であるＳｅｔＣｏｍｍＴｉｍｅｏｕｔｓ（）関数をコールして、Ｂｌｕｅｔｏｏｔｈ通信のＷｒｉｔｅ／Ｒｅａｄのタイムアウト時間を次のように設定する（Ｓ６３９）。
Ｗｒｉｔｅのタイムアウト時間：  ３秒
Ｒｅａｄのタイムアウト時間：    １秒
ステップＳ６３９の後、ＬＭ３６はＰＭ３７内のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ６０７）。ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ６０８）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｃｏｎｎｅｃｔ（）関数をコールする（Ｓ６０９）。ＢＴ＿Ｃｏｎｎｅｃｔ（）関数が実行されると（Ｓ６１０）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２２で後述する処理を行い（Ｓ６１１）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ（Ｓｔａｃｋ）からＰＭ３７に、このＢＴ＿Ｃｏｎｎｅｃｔ（）関数がリターンされる（Ｓ６１２）。そして、ＰＭ３７からＬＭ３６に、ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数がリターンされ（Ｓ６１３）、ＬＭ３６からＳｐｏｏｌｅｒからＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数がリターンされる（Ｓ６１４）。そして、Ｓｐｏｏｌｅｒは、ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数内においてＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６１５）。この時、図２７に示す引数ｐＢｕｆｆｅｒに前記印刷制御コマンドが含まれていて、ｃｂＢｕｆにそのサイズ（単位：バイト）がセットされている。
【００６９】
ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が実行されると（Ｓ６１６）、ＬＭ３６はＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６１７）。ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が実行されると（Ｓ６１８）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｓｅｎｄ１（）関数をコールする（Ｓ６１９）。ＢＴ＿Ｓｅｎｄ１（）関数が実行されると（Ｓ６２０）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図１５で後述する処理を行い（Ｓ６２１）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）からＰＭ３７に、このＢＴ＿Ｓｅｎｄ１（）関数がリターンされる（Ｓ６２２）。ＢＴ＿Ｓｅｎｄ１（）関数がリターンされると、ＰＭ３７はＬＭ３６にＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数がリターンされ（Ｓ６２３）、ＬＭ３６からＳｐｏｏｌｅｒにＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数がリターンされる（Ｓ６２４）。その後、Ｓｐｏｏｌｅｒは印刷画像データを表す印刷制御コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６２５）。これ以降において、実行されるＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の処理はステップＳ６１６で説明した処理と同様であるので、ここではその説明を省略する。
【００７０】
ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した場合、プリンタ３が前記印刷制御コマンドを受信してそのコマンドに従って記録出力（印刷）を行う。印刷画像データを表す印刷制御コマンドの送信が全て完了すると、Ｓｐｏｏｌｅｒは前記印刷終了コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６２６）。ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した場合、プリンタ３が前記印刷終了コマンドを受信して、ニュートラルモードに移行する。そして、ＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ６２７）。ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ６２８）、ＬＭ３６はＰＭ３７内のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ６２９）。ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ６３０）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数をコールする（Ｓ６３１）。ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数が実行されると（Ｓ６３２）、図２３で後述する処理を行い（Ｓ６３３）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）からＰＭ３７に、このＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数がリターンされ（Ｓ６３４）、ＰＭ３７からＬＭ３６にＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がリターンされる（Ｓ６３５）。ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がリターンされると、ＬＭ３６からＳｐｏｏｌｅｒにＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がリターンされ（Ｓ６３６）、ＳｐｏｏｌｅｒはＳｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数を終了する（Ｓ６３７）。印刷が正常に終了した場合、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識された状態が維持される（Ｓ６３８）。
【００７１】
図７、図８はＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の本実施形態で新たに提案する関数フローを表す図である。これらの図では関数成功時に成功を表すＴＲＵＥを返すリターン処理やエラー時の処理の一部、及びクラスドライバ３８における処理を省略している。これらの図において、最上段は処理の実行元を表しており、Ｕｓｅｒはユーザにおける操作（処理）、Ｓｐｏｏｌｅｒは図４で説明したＷｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのＳｐｏｏｌｅｒにおける処理、ＬＭはＬＭ３６における処理、ＰＭはＰＭ３７における処理、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）はＢｌｕｅｔｏｏｔｈポート７を構成するハードウェアまたはファームウェアのスタックにおける処理をそれぞれ表す。例えば、Ｕｓｅｒの列を見ると「プリンタの電源をオン」というようなユーザの操作（処理）が示されている。この例のように、それぞれの列がその列の実行元における処理を表す。図７において、ユーザがプリンタの電源をオンにした時（Ｓ７０１）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識される（Ｓ７０２）。ユーザが印刷を開始すると（Ｓ７０３）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行される（Ｓ７０４）。ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行されると（Ｓ７０４）、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ７０５）。ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ７０６）、ＬＭ３６はＯＳの標準関数であるＳｅｔＣｏｍｍＴｉｍｅｏｕｔｓ（）関数をコールして、Ｂｌｕｅｔｏｏｔｈ通信のＷｒｉｔｅ／Ｒｅａｄのタイムアウト時間を次のように設定する（Ｓ７４２）。
Ｗｒｉｔｅのタイムアウト時間：  ３秒
Ｒｅａｄのタイムアウト時間：    １秒
ステップＳ７４２の後、ＬＭ３６はＢｌｕｅｔｏｏｔｈ通信の接続状態を表す通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）して初期化し（Ｓ７０７）、ＰＭ３７内のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ７０８）。ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ７０９）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｃｏｎｎｅｃｔ（）関数をコールする（Ｓ７１０）。ＢＴ＿Ｃｏｎｎｅｃｔ（）関数が実行されると（Ｓ７１０）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２２で後述する処理を行い（Ｓ７１２）、このＢＴ＿Ｃｏｎｎｅｃｔ（）関数がＰＭ３７にリターンされ（Ｓ７１３）、ＬＭ３６にＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数がリターンされる（Ｓ７１４）。
【００７２】
ステップＳ７０８でコールしたＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が成功した場合、ＬＭ３６はＢｌｕｅｔｏｏｔｈ通信の接続状態を表す通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをセット（１）し（Ｓ７１５）、ステップＳ７０８の処理を終了し（Ｓ７１６）、ＳｐｏｏｌｅｒにＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数がリターンされる（Ｓ７１７）。そして、ＳｐｏｏｌｅｒはＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数内においてＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ７１８）。この時、図２７に示す引数ｐＢｕｆｆｅｒに前記印刷制御コマンドが含まれていて、ｃｂＢｕｆにそのサイズ（単位：バイト）がセットされている。ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が実行されると（Ｓ７１９）、通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇがセット（１）されている場合（Ｓ７２０）、図２９に示す通りＣｏｎｔｒｏｌＩＤにＩＯＣＴＬ＿ＢＬＵＥＴＯＯＴＨ＿ＣＯＭＭＵＮＩＣＡＴＩＯＮをセットしてＰＭ３７内のＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数をコールする（Ｓ７２１）。ＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数が実行されると（Ｓ７２２）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数をコールする（Ｓ７２３）。ＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数が実行されると（Ｓ７２４）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２０で後述する処理を行い（Ｓ７２５）、ＰＭ３７に、このＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数がリターンされ（Ｓ７２６）、その戻り値が図２９に示す＊ｌｐＯｕｔＢｕｆｆｅｒに代入され（Ｓ７２３）、ＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数がＬＭ３６にリターンされる（Ｓ７２７）。＊ｌｐＯｕｔＢｕｆｆｅｒの値が、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤの場合（Ｓ７２８）、ＬＭ３６はＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ７２９）。ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が実行されると（Ｓ７３０）ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｓｅｎｄ２（）関数をコールする（Ｓ７３１）。ＢＴ＿Ｓｅｎｄ２（）関数が実行されると（Ｓ７３２）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２１で後述する処理を行い（Ｓ７３３）、ＰＭ３７にこのＢＴ＿Ｓｅｎｄ２（）関数がリターンされ（Ｓ７３４）、ＬＭ３６にＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数がリターンされ（Ｓ７３５）、ステップＳ７２８に戻る。ステップＳ７２８において、＊ｌｐＯｕｔＢｕｆｆｅｒの値がＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ以外の場合、通信状態に異常があると判断してステップＳ７２８の処理を終了し（Ｓ７３６）、ステップＳ７３７に進む。ステップＳ７３７の処理が開始されると、ＬＭ３６は通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）し（Ｓ７３８）、失敗を表すＦＡＬＳＥをＳｐｏｏｌｅｒに返し（Ｓ７３９）、ステップＳ７３７の処理を終了し（Ｓ７４０）、ステップＳ７２��に戻る。ステップＳ７２０において、通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇがクリア（０）されている場合、ＬＭ２６はステップＳ７２０の処理を終了し（Ｓ７４１）、図８のステップＳ８０１に進む。
【００７３】
ステップＳ８０１の処理が開始されると、ＬＭ３６はＳｐｏｏｌｅｒに失敗を表すＦＡＬＳＥを返し（Ｓ８０２）、ステップＳ８０１の処理を終了し（Ｓ８０３）、ＳｐｏｏｌｅｒにＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数がリターンされる（Ｓ８０４）。ステップＳ７１８のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した後、Ｓｐｏｏｌｅｒは印刷画像データを表す印刷制御コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ８０５）。これ以降において、実行されるＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の処理はステップＳ７１９で説明した処理と同様であるので、ここではその説明を省略する。ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した場合、プリンタ３が前記印刷制御コマンドを受信してそのコマンドに従って記録出力（印刷）を行う。
【００７４】
印刷画像データを表す印刷制御コマンドの送信が全て完了すると、Ｓｐｏｏｌｅｒは前記印刷終了コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ８０６）。ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した場合、プリンタ３が前記印刷終了コマンドを受信して、ニュートラルモードに移行する。そして、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ８０７）。ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ８０８）、ＬＭ３６はＰＭ３７内のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ８０９）。ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が実行されると（Ｓ８１０）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数をコールする（Ｓ８１１）。ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数が実行されると（Ｓ８１２）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２３で後述する処理を行い（Ｓ８１３）、このＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数がＰＭ３７にリターンされる（Ｓ８１４）。ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数がリターンされると、ＰＭ３７からＬＭ３６にＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がリターンされ（Ｓ８１５）、ＬＭ３６はＢｌｕｅｔｏｏｔｈ通信の接続状態を表す通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）して初期化し（Ｓ８１６）、ＳｐｏｏｌｅｒにＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数がリターンされ（Ｓ８１７）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数を終了する（Ｓ８１８）。印刷が正常に終了した場合、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識された状態が維持される（Ｓ８１９）。ステップＳ７３９、Ｓ８０２において、失敗を表すＦＡＬＳＥが返された場合、ＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の戻り値もＦＡＬＳＥとなり、これがＳｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数に返され、それ以降Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数がＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールせず、印刷ジョブがエラー終了される。従って、図３で前述したような、例えばプリンタ３が印刷制御モードで印刷中に無線通信の電波状況が悪くなって通信リンクが切断され、印刷制御モードからニュートラルモードに移行してしまっている状態において、その後無線通信の電波状況が良好となっても、それ以降、続きの印刷制御コマンドが送られることはない。これにより、不正印字等の誤動作を引き起こすこともなくなる。
【００７５】
以上説明したように、ステップＳ７２１において、ＬＭ３６がＰＭ３７内のＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数をコールして、その引数で渡す＊ｌｐＯｕｔＢｕｆｆｅｒにセットされた戻り値を確認する。この戻り値が、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤの場合は、ＬＭ３６はＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールして、前記印刷開始コマンド、前記印刷制御コマンド、前記印刷終了コマンド等のコマンド（データ）を送信する。ＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ以外の場合は、通信状態に異常があると判断して失敗を表すＦＡＬＳＥを上位関数に返して印刷ジョブをエラー終了させるので、不正な印字等の誤動作をしないように防止することができる。
【００７６】
このように、図１５、図２１で後述するようなＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段（第１の通信状態確認手段）とは別に、処理のロジックが異なるＬＭ３６におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段（第２の通信状態確認手段）を新たに設け、プリンタドライバ５０がこの第２の通信状態確認手段を利用してＰＣ１からプリンタ３への安全なデータ送信を制御する、という点が特徴的な新規技術である。
【００７７】
図３２はプリンタの状態をモニタするステータスモニタを表す図である。ここでは、同図のステータスモニタが、ＰＣ１にインストールされているアプリケーション３０であると仮定する。同図において、２０１はステータスモニタのメインウィンドウであり、プリンタ３（ＸＹＺ社製のｋｍｍｎというモデル名のプリンタ）の現在の状態を表している。
【００７８】
２０２はプリンタ情報（Ｐｒｉｎｔｅｒ  Ｉｎｆｏｒｍａｔｉｏｎ）表示部であり、プリンタがＯｎｌｉｎｅ（オンライン）の状態であることを表している。２０３はインク情報（Ｉｎｋ  Ｉｎｆｏｒｍａｔｉｏｎ）表示部であり、プリンタ３のインクの情報を表す。２０４はインク残量表示部であり、プリンタ３に搭載されている各インクの残量を表示する。同図に示す通り、プリンタ３には黒（Ｂｌａｃｋ）、黄（Ｙｅｌｌｏｗ）、マゼンタ（Ｍａｇｅｎｔａ）、シアン（Ｃｙａｎ）の４色のインクが装着されており、それぞれの色のインクの残量が８０％、５０％、０％（インク残量無し）、１００％（インク残量満タン）であることを表している。このステータスモニタは、プリンタ３からステータス制御コマンドを５秒間隔でポーリングしながら受信し、このステータス制御コマンドに従ってその状態表示を更新する仕組みで、プリンタ３の状態表示をほぼリアルタイムで更新する。このような制御方法に関しては一般的な方法であるので、ここではその詳細説明を省略する。
【００７９】
Ｂｌｕｅｔｏｏｔｈのような無線通信の場合に、ＰＣ１が例えば５秒の間隔でポーリングしてステータス制御コマンドを受信し、プリンタ３の状態表示を更新するとする。Ｂｌｕｅｔｏｏｔｈの無線通信の電波状況が悪くなって通信リンクが確立されているのか、切断されているのかが不明な状態の時に、前記ポーリングによるステータス制御コマンドの受信を試みると、Ｂｌｕｅｔｏｏｔｈを制御するハードウェアやファームウェア（Ｂｌｕｅｔｏｏｔｈポート７）が受信をリトライする。このリトライ処理を行っても、プリンタ３からステータス制御コマンドを受信することができないときは、ステータスモニタに処理が返って来ない場合がある。この間、ステータスモニタが制御不能な状態に陥る、という問題がある。
【００８０】
図２６は図３２のステータスモニタを起動した状態でＵＳＢインタフェース４を介して印刷を行った時の関数フローを表す図である。同図では関数成功時に成功を表すＴＲＵＥを返すリターン処理やエラー時の処理の一部、及びクラスドライバ３８における処理を省略している。同図において、最上段は処理の実行元を表しており、Ｕｓｅｒはユーザにおける操作（処理）、Ｓｐｏｏｌｅｒは図４で説明したＷｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのＳｐｏｏｌｅｒにおける処理、ＬＭはＬＭ３６における処理、ＰＭはＰＭ３７における処理、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）はＵＳＢポート５を構成するハードウェアまたはファームウェアのスタックにおける処理をそれぞれ表す。例えば、Ｕｓｅｒの列を見ると「ＵＳＢでＰＣとプリンタを接続」というようなユーザの操作（処理）が示されている。この例のように、それぞれの列がその列の実行元における処理を表す。同図では、図５で説明した処理と同じ処理に関しては、図５で使用したステップ番号を記し、その説明を省略している。同図において、ユーザがＰＣ１とプリンタ３をＵＳＢインタフェース４を介して接続した時（Ｓ５０１）、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）においてＵＳＢの接続が完了されて送受信可能な状態になる（Ｓ５０２）。ユーザが印刷を開始すると（Ｓ５０３）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行される（Ｓ５０４）。ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行されると（Ｓ５０４）、ＳｐｌｏｏｅｒはＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールし（Ｓ５０５）、ＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５１２）。この時、図２７に示すｐＢｕｆｆｅｒに前記印刷開始コマンドが含まれていて、ｃｂＢｕｆにそのサイズ（単位：バイト）がセットされている。
【００８１】
図３２のステータスモニタから５秒間隔でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２６０１）。ＬＭ＿ＲｅａｄＰｏｒｔ（）関数が実行されると（Ｓ２６０２）、ＬＭ３６はＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２６０３）。ＰＭ＿ＲｅａｄＰｏｒｔ（）関数が実行されると（Ｓ２６０４）、ＰＭ３７はＵＳＢ  ＨＷ  （Ｓｔａｃｋ）内のＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数をコールする（Ｓ２６０５）。ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数が実行されると（Ｓ２６０６）、ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）は図１５で後述する処理を行い（Ｓ２６０７）、ＰＭ３７にこのＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数がリターンされる（Ｓ２６０８）。ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数がリターンされると、ＬＭ３６にＰＭ＿ＲｅａｄＰｏｒｔ（）関数がリターンされ（Ｓ２６０９）、ＳｐｏｏｌｅｒにＬＭ＿ＲｅａｄＰｏｒｔ（）関数がリターンされる（Ｓ２６１０）。この時、プリンタ３からＰＣ１に送られてきたステータス制御コマンドが図２７に示すＬＭ＿ＲｅａｄＰｏｒｔ（）関数のｐＢｕｆｆｅｒに格納され、ｃｂＢｕｆｆｅｒにそのサイズ（単位：バイト）がセットされている。そしてこのステータス制御コマンドが図３２のステータスモニタに返され、図３２のステータスモニタがこのステータス制御コマンドに従ってその状態表示を更新する。これ以降において、実行されるＬＭ＿ＲｅａｄＰｏｒｔ（）関数の処理は後述のステップＳ２４０２で説明する処理と同様であるので、ここではその説明を省略する。ステップＳ５１２のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した後、Ｓｐｏｏｌｅｒは印刷画像データを表す印刷制御コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５２２）。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２６１１）。印刷画像データを表す印刷制御コマンドの送信が全て完了すると、Ｓｐｏｏｌｅｒは前記印刷終了コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ５２３）。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２６１２）。そして、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールし（Ｓ５２４）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数を終了する（Ｓ５３１）。印刷が正常に終了した場合、その後もＵＳＢ  ＨＷ  （Ｓｔａｃｋ）において送受信可能な状態が維持される（Ｓ５３２）。
【００８２】
図２４は図３２のステータスモニタを起動した状態でＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の従来例の関数フローを表す図である。同図では関数成功時に成功を表すＴＲＵＥを返すリターン処理やエラー時の処理の一部、及びクラスドライバ３８における処理を省略している。同図において、最上段は処理の実行元を表しており、Ｕｓｅｒはユーザにおける操作（処理）、Ｓｐｏｏｌｅｒは図４で説明したＷｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのＳｐｏｏｌｅｒにおける処理、ＬＭはＬＭ３６における処理、ＰＭはＰＭ３７における処理、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）はＢｌｕｅｔｏｏｔｈポート７を構成するハードウェアまたはファームウェアのスタックにおける処理をそれぞれ表す。例えば、Ｕｓｅｒの列を見ると「プリンタの電源をオン」というようなユーザの操作（処理）が示されている。この例のように、それぞれの列がその列の実行元における処理を表す。同図では、図６で説明した処理と同じ処理に関しては、図６で使用したステップ番号を記し、その説明を省略している。
【００８３】
同図において、ユーザがプリンタの電源をオンにした時（Ｓ６０１）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識される（Ｓ６０２）。ユーザが印刷を開始すると（Ｓ６０３）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行される（Ｓ６０４）。ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行されると（Ｓ６０４）、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールし（Ｓ６０５）、ＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６１５）。この時、図２７に示す引数ｐＢｕｆｆｅｒに前記印刷制御コマンドが含まれていて、ｃｂＢｕｆにそのサイズ（単位：バイト）がセットされている。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２４０１）。ＬＭ＿ＲｅａｄＰｏｒｔ（）関数が実行されると（Ｓ２４０２）、ＬＭ３６はＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２４０３）。ＰＭ＿ＲｅａｄＰｏｒｔ（）関数が実行されると（Ｓ２４０４）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｒｅｃｅｉｖｅ１（）関数をコールする（Ｓ２４０５）。ＢＴ＿Ｒｅｃｅｉｖｅ１（）関数が実行されると（Ｓ２４０６）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図１５で後述する処理を行い（Ｓ２４０７）、このＢＴ＿Ｒｅｃｅｉｖｅ１（）関数がＰＭ３７にリターンされる（Ｓ２４０８）。このＢＴ＿Ｒｅｃｅｉｖｅ１（）関数がリターンされると、ＬＭ３６にＰＭ＿ＲｅａｄＰｏｒｔ（）関数がリターンされ（Ｓ２４０９）、ＳｐｏｏｌｅｒにＬＭ＿ＲｅａｄＰｏｒｔ（）関数がリターンされる（Ｓ２４１０）。
【００８４】
この時、プリンタ３からＰＣ１に送られてきたステータス制御コマンドが図２７に示すＬＭ＿ＲｅａｄＰｏｒｔ（）関数のｐＢｕｆｆｅｒに格納され、ｃｂＢｕｆｆｅｒにそのサイズ（単位：バイト）がセットされている。そしてこのステータス制御コマンドが図３２のステータスモニタに返され、図３２のステータスモニタがこのステータス制御コマンドに従ってその状態表示を更新する。これ以降において、実行されるＬＭ＿ＲｅａｄＰｏｒｔ（）関数の処理はステップＳ２４０２で説明した処理と同様であるので、ここではその説明を省略する。ステップＳ６１５のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した後、Ｓｐｏｏｌｅｒは印刷画像データを表す印刷制御コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６２５）。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２４１１）。Ｓｐｏｏｌｅｒは印刷画像データを表す印刷制御コマンドの送信が全て完了すると、前記印刷終了コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ６２６）。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２４１２）。そして、ＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールし（Ｓ６２７）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数を終了する（Ｓ６３７）。印刷が正常に終了した場合、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識された状態が維持される（Ｓ６３８）。
【００８５】
図２５は図３２のステータスモニタを起動した状態でＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の本実施形態で新たに提案する関数フローを表す図である。同図では関数成功時に成功を表すＴＲＵＥを返すリターン処理やエラー時の処理の一部、及びクラスドライバ３８における処理を省略している。同図において、最上段は処理の実行元を表しており、Ｕｓｅｒはユーザにおける操作（処理）、Ｓｐｏｏｌｅｒは図４で説明したＷｉｎｄｏｗｓ（登録商標）  ＸＰ  ＯＳのＳｐｏｏｌｅｒにおける処理、ＬＭはＬＭ３６における処理、ＰＭはＰＭ３７における処理、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）はＢｌｕｅｔｏｏｔｈポート７を構成するハードウェアまたはファームウェアのスタックにおける処理をそれぞれ表す。例えば、Ｕｓｅｒの列を見ると「プリンタの電源をオン」というようなユーザの操作（処理）が示されている。この例のように、それぞれの列がその列の実行元における処理を表す。同図では、図７、図８で説明した処理と同じ処理に関しては、図７、図８で使用したステップ番号を記し、その説明を省略している。
【００８６】
同図において、ユーザがプリンタの電源をオンにした時（Ｓ７０１）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識される（Ｓ７０２）。ユーザが印刷を開始すると（Ｓ７０３）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行される（Ｓ７０４）。ＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数が実行されると（Ｓ７０４）、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールし（Ｓ７０５）、ＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ７１８）。この時、図２７に示す引数ｐＢｕｆｆｅｒに前記印刷制御コマンドが含まれていて、ｃｂＢｕｆにそのサイズ（単位：バイト）がセットされている。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２５０１）。ＬＭ＿ＲｅａｄＰｏｒｔ（）関数が実行されると（Ｓ２５０２）、ＬＭ３６は通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇがセット（１）されている場合（Ｓ２５０３）、図２９に示す通りＣｏｎｔｒｏｌＩＤにＩＯＣＴＬ＿ＢＬＵＥＴＯＯＴＨ＿ＣＯＭＭＵＮＩＣＡＴＩＯＮをセットしてＰＭ３７内のＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数をコールする（Ｓ２５０４）。ＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数が実行されると（Ｓ２５０５）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数をコールする（Ｓ２５０６）。
【００８７】
ＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数が実行されると（Ｓ２５０７）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２０で後述する処理を行い（Ｓ２５０８）、このＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数がＰＭ３７にリターンされ（Ｓ２５０９）、その戻り値が図２９に示す＊ｌｐＯｕｔＢｕｆｆｅｒに代入され（Ｓ２５０６）、ＬＭ３６にＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数がリターンされる（Ｓ２５１０）。＊ｌｐＯｕｔＢｕｆｆｅｒの値がＢｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤの場合（Ｓ２５１１）、ＬＭ３６はＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２５１２）。ＰＭ＿ＲｅａｄＰｏｒｔ（）関数が実行されると（Ｓ２５１３）、ＰＭ３７はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｒｅｃｅｉｖｅ２（）関数をコールする（Ｓ２５１４）。ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数が実行されると（Ｓ２５１５）、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）は図２１で後述する処理を行い（Ｓ２５１６）、このＢＴ＿Ｒｅｃｅｉｖｅ２（）関数がＰＭ３７にリターンされ（Ｓ２５１７）、ＬＭ３６にＰＭ＿ＲｅａｄＰｏｒｔ（）関数がリターンされ（Ｓ２５１８）、ステップＳ２５１１に戻る。
【００８８】
ステップＳ２５１１において、＊ｌｐＯｕｔＢｕｆｆｅｒの値がＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ以外の場合、通信状態に異常があると判断してステップＳ２５１１の処理を終了し（Ｓ２５１９）、ステップＳ２５２０に進む。ステップＳ２５２０の処理が開始されると、ＬＭ３６は通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）し（Ｓ２５２１）、失敗を表すＦＡＬＳＥをＳｐｏｏｌｅｒに返し（Ｓ２５２２）、ステップＳ２５２０の処理を終了し（Ｓ２５２３）、ステップＳ２５０３に戻る。
【００８９】
ステップＳ２５０３において、ＬＭ３６は通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇがクリア（０）されている場合、ステップＳ２５０３の処理を終了し（Ｓ２５２４）、ステップＳ２５２５に進む。ステップＳ２５２５の処理が開始されると、失敗を表すＦＡＬＳＥをＳｐｏｏｌｅｒに返し（Ｓ２５２６）、ステップＳ２５２５の処理を終了し（Ｓ２５２７）、ＬＭ＿ＲｅａｄＰｏｒｔ（）関数がリターンされる（Ｓ２５２８）。この時、プリンタ３からＰＣ１に送られてきたステータス制御コマンドが図２７に示すＬＭ＿ＲｅａｄＰｏｒｔ（）関数のｐＢｕｆｆｅｒに格納され、ｃｂＢｕｆｆｅｒにそのサイズ（単位：バイト）がセットされている。そしてこのステータス制御コマンドが図３２のステータスモニタに返され、図３２のステータスモニタがこのステータス制御コマンドに従ってその状態表示を更新する。これ以降において、実行されるＬＭ＿ＲｅａｄＰｏｒｔ（）関数の処理はステップＳ２５０２で説明した処理と同様であるので、ここではその説明を省略する。
【００９０】
ステップＳ７１８のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数が成功した後、Ｓｐｏｏｌｅｒは印刷画像データを表す印刷制御コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ８０５）。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２５２９）。印刷画像データを表す印刷制御コマンドの送信が全て完了すると、前記印刷終了コマンドを含む（引数ｐＢｕｆｆｅｒで渡される）ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールする（Ｓ８０６）。図３２のステータスモニタから５秒感覚でポーリングされるＲｅａｄ要求が印刷ジョブ内に割り込んで入ってくると、ＳｐｏｏｌｅｒはＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールする（Ｓ２５３０）。そして、ＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールし（Ｓ８０７）、Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数を終了する（Ｓ８１８）。
【００９１】
印刷が正常に終了した場合、Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）においてデバイス（プリンタ３）が認識された状態が維持される（Ｓ８１９）。ステップＳ２５２２、Ｓ２５２６において、Ｓｐｏｏｌｅｒに失敗を表すＦＡＬＳＥが返された場合、ＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数の戻り値もＦＡＬＳＥとなり、これがＳｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数に返され、それ以降Ｓｐｏｏｌｅｒ内のＳｔａｒｔＰｒｉｎｔＪｏｂ（）関数がＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数やＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールせず、印刷ジョブがエラー終了される。従って、図３で前述したような、例えばプリンタ３が印刷制御モードで印刷中に無線通信の電波状況が悪くなって通信リンクが切断され、印刷制御モードからニュートラルモードに移行してしまっている状態になり、その後無線通信の電波状況が良好となっても、それ以降、続きの印刷制御コマンドが送られることはない。その結果、不正印字等の誤動作を引き起こすこともなくなる。
【００９２】
また、図３２で前述したような、例えばＢｌｕｅｔｏｏｔｈの無線通信の電波状況が悪くなって通信リンクが確立されているのか、切断されているのかが不明な状態の時において、それ以降、前記ポーリングによるステータス制御コマンドの受信を試みない。よって、ステータス制御コマンドを受信することができないままステータスモニタに処理が返って来ないようなケースに陥ることがなく、ステータスモニタが制御不能な状態に陥ることもない。
【００９３】
以上説明したように、ステップＳ２５０４において、ＬＭ３６がＰＭ３７内のＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数をコールして、その引数で渡す＊ｌｐＯｕｔＢｕｆｆｅｒにセットされた戻り値を確認する。この戻り値が、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤの場合はＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数をコールして、前記ステータス制御コマンドの受信を試みる。ＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ以外の場合は、通信状態に異常があると判断して失敗を表すＦＡＬＳＥを上位関数に返して印刷ジョブをエラー終了させ、それ以降、前記ポーリングによるステータス制御コマンドの受信を試みない。これにより、不正な印字等の誤動作をしないように防止することができ、また、ステータス制御コマンドを受信することができないままステータスモニタに処理が返って来ないようなケースに陥ることがなく、ステータスモニタが制御不能な状態に陥ることもない。このように、図１５、図２１で後述するようなＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段（第１の通信状態確認手段）とは別に、処理のロジックが異なるＬＭ３６におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段（第２の通信状態確認手段）を新たに設ける。プリンタドライバ５０はこの第２の通信状態確認手段を利用してＰＣ１からプリンタ３への安全なデータ送信を制御し、また、ＰＣ１がプリンタ３からの安全なデータ受信の制御も行う、という点が特徴的な新規技術である。
【００９４】
図９は図５及び図６で説明したＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数の従来例の処理を表すフローチャートである。
【００９５】
同図において、ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が開始されると（Ｓ９０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化し（Ｓ９０２）、ＳｅｔＣｏｍｍＴｉｍｅｏｕｔｓ（）関数をコールし、ＵＳＢ通信またはＢｌｕｅｔｏｏｔｈ通信のＷｒｉｔｅ／Ｒｅａｄのタイムアウト時間を設定する（Ｓ９０６）。そして、図１２で後述するＰＭ３７のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ９０３）。ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が成功してＰＭ３７からＴＲＵＥが返ってきた場合（Ｓ９０４）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ９０５）、ｂＲｅｔをＳｐｏｏｌｅｒに返してこの関数を終了する（Ｓ９０７）。ステップＳ９０４において、ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ９０７に進みｂＲｅｔを返してこの関数を終了する。
【００９６】
図１０は図５及び図６で説明したＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２４で説明したＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数の従来例の処理を表すフローチャートである。同図において、ステップ内に括弧（  ）で括られた部分があるステップに関しては、括弧で括られている方がＬＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を表し、他方（括弧で括られていない方）がＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数における処理を表す。また、ステップ内に括弧（  ）で括られた部分がないステップに関しては、ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数とＬＭ＿ＲｅａｄＰｏｒｔ（）関数の両者における共通の処理を表す。以下の説明においても、ＬＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を括弧（  ）で括って説明する。
【００９７】
同図において、ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＬＭ＿ＲｅａｄＰｏｒｔ（）関数）が開始されると（Ｓ１００１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１００２）。また、図２７に示すＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の＊ｐｃｂＷｒｉｔｔｅｎ（ＬＭ＿ＲｅａｄＰｏｒｔ（）関数の＊ｐｃｂＲｅａｄ）に０を代入して初期化し（Ｓ１００３）、図１３で後述するＰＭ３７のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）をコールする（Ｓ１００４）。ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）が成功した場合（Ｓ１００５）、＊ｐｃｂＷｒｉｔｔｅｎに送信したデータ数（＊ｐｃｂＲｅａｄに受信したデータ数）を代入し（Ｓ１００６）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１００７）、ＳｐｏｏｌｅｒにｂＲｅｔを返してこの関数を終了する（Ｓ１００８）。ステップＳ１００５において、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１００８に進みｂＲｅｔを返してこの関数を終了する。
【００９８】
図１１は図５及び図６で説明したＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数の従来例の処理を表すフローチャートである。
【００９９】
同図において、ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が開始されると（Ｓ１１０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化し（Ｓ１１０２）、図１４で後述するＰＭ３７のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ１１０３）。ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が成功してＰＭ３７からＴＲＵＥが返ってきた場合（Ｓ１１０４）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１１０５）、ＳｐｏｏｌｅｒにｂＲｅｔを返してこの関数を終了する（Ｓ１１０６）。ステップＳ１１０４において、ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１１０６に進みｂＲｅｔを返してこの関数を終了する。
【０１００】
図１２は図５及び図６で説明したＰＭ３７内のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数の従来例の処理を表すフローチャートである。
【０１０１】
同図において、ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が開始されると（Ｓ１２０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化し（Ｓ１２０２）、Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１２０３）、図２２で後述するＢＴ＿Ｃｏｎｎｅｃｔ（）関数をコールする（Ｓ１２０４）。ＢＴ＿Ｃｏｎｎｅｃｔ（）関数が成功してＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）からＴＲＵＥが返ってきた場合（Ｓ１２０５）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１２０６）、ｂＲｅｔをＬＭ３６に返してこの関数を終了する（Ｓ１２０７）。ステップＳ１２０５において、ＢＴ＿Ｃｏｎｎｅｃｔ（）関数が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１２０７に進みｂＲｅｔを返してこの関数を終了する。ステップＳ１２０３において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ステップＳ１２０６に進む。
【０１０２】
図１３は図５及び図６で説明したＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２４で説明したＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数の従来例の処理を表すフローチャートである。同図において、ステップ内に括弧（  ）で括られた部分があるステップに関しては、括弧で括られている方がＰＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を表し、他方（括弧で括られていない方）がＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数における処理を表す。また、ステップ内に括弧（  ）で括られた部分がないステップに関しては、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数とＰＭ＿ＲｅａｄＰｏｒｔ（）関数の両者における共通の処理を表す。以下の説明においても、ＰＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を括弧（  ）で括って説明する。
【０１０３】
同図において、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）が開始されると（Ｓ１３０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１３０２）。また、図２８に示すＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の＊ｐｃｂＷｒｉｔｔｅｎ（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数の＊ｐｃｂＲｅａｄ）に０を代入して初期化する（Ｓ１３０３）。Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１３０４）、図１５で後述するＢＴ＿Ｓｅｎｄ１（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ１（）関数）をコールする（Ｓ１３０５）。ステップＳ１３０４において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ＵＳＢ＿Ｓｅｎｄ（）関数（ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数））をコールする（Ｓ１３０９）。Ｂｌｕｅｔｏｏｔｈ通信の場合はＢＴ＿Ｓｅｎｄ１（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ１（）関数）が、ＵＳＢ通信の場合はＵＳＢ＿Ｓｅｎｄ（）関数（ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数））が成功した場合（Ｓ１３０６）、＊ｐｃｂＷｒｉｔｔｅｎに送信したデータ数（＊ｐｃｂＲｅａｄに受信したデータ数）を代入し（Ｓ１３０７）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１３０８）、ｂＲｅｔをＬＭ３６に返してこの関数を終了する（Ｓ１３１０）。ステップＳ１３０６において、Ｂｌｕｅｔｏｏｔｈ通信の場合はＢＴ＿Ｓｅｎｄ１（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ１（）関数）が、ＵＳＢ通信の場合はＵＳＢ＿Ｓｅｎｄ（）関数（ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数））が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１３１０に進みｂＲｅｔを返してこの関数を終了する。
【０１０４】
図１４は図５及び図６で説明したＰＭ３７内のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数の従来例の処理を表すフローチャートである。
【０１０５】
同図において、ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が開始されると（Ｓ１４０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１４０２）。Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１４０３）、図２３で後述するＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数をコールする（Ｓ１４０４）。ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数が成功してＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）からＴＲＵＥが返ってきた場合（Ｓ１４０５）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１４０６）、ｂＲｅｔをＬＭ３６に返してこの関数を終了する（Ｓ１４０７）。ステップＳ１４０５において、ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１４０７に進みｂＲｅｔを返してこの関数を終了する。ステップＳ１４０３において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ステップＳ１４０６に進む。
【０１０６】
図２２は図６及び図７で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｃｏｎｎｅｃｔ（）関数の処理を表すフローチャートである。同図において、ＢＴ＿Ｃｏｎｎｅｃｔ（）関数が開始されると（Ｓ２２０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化し（Ｓ２２０２）、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の状態を確認する（Ｓ２２０３）。通信リンクが既に確立されている場合（Ｓ２２０４）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ２２０７）、ｂＲｅｔをＰＭ３７に返してこの関数を終了する（Ｓ２２０８）。ステップＳ２２０４において、通信リンクが確立されていない場合、通信リンクの確立を試みる（Ｓ２２０５）。通信リンクが確立された場合（Ｓ２２０６）、ステップＳ２２０７に進む。ステップＳ２２０６において、通信リンクが確立されなかった場合、ステップＳ２２０８に進みｂＲｅｔを返してこの関数を終了する。
【０１０７】
図１５は図５及び図６で説明したＵＳＢ  ＨＷ  （Ｓｔａｃｋ）内のＵＳＢ＿Ｓｅｎｄ（）関数及びＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｓｅｎｄ１（）関数と、図２６及び図２４で説明したＵＳＢ  ＨＷ  （Ｓｔａｃｋ）内のＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数及びＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｒｅｃｅｉｖｅ１（）関数の従来例の処理を表すフローチャートである。同図において、ステップ内に括弧（  ）で括られた部分があるステップに関しては、括弧で括られている方がＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数またはＢＴ＿Ｒｅｃｅｉｖｅ１（）関数における処理を表し、他方（括弧で括られていない方）がＵＳＢ＿Ｓｅｎｄ（）関数またはＢＴ＿Ｓｅｎｄ１（）関数における処理を表す。また、ステップ内に括弧（  ）で括られた部分がないステップ（但し、ステップＳ１５１２を除く）に関しては、ＵＳＢ＿Ｓｅｎｄ（）関数またはＢＴ＿Ｓｅｎｄ１（）関数と、ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数またはＢＴ＿Ｒｅｃｅｉｖｅ１（）関数の両者における共通の処理を表す。以下の説明においても、ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数またはＢＴ＿Ｒｅｃｅｉｖｅ１（）関数における処理を括弧（  ）で括って説明する。
【０１０８】
同図において、ＵＳＢ＿Ｓｅｎｄ（）またはＢＴ＿Ｓｅｎｄ１（）関数（ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数またはＢＴ＿Ｒｅｃｅｉｖｅ１（）関数）が開始されると（Ｓ１５０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１５０２）。また、図３０に示すＵＳＢ＿Ｓｅｎｄ（）関数または図３１に示すＢＴ＿Ｓｅｎｄ１（）関数の＊ｐｃｂＷｒｉｔｔｅｎ（図３０に示すＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数または図３１に示すＢＴ＿Ｒｅｃｅｉｖｅ１（）関数の＊ｐｃｂＲｅａｄ）に０を代入して初期化する（Ｓ１５０３）。プリンタ３が接続されているＵＳＢインタフェース４またはＢｌｕｅｔｏｏｔｈインタフェース９のアイドル状態を確認する（Ｓ１５０４）。アイドル中の場合（１５０５）、データパケットを送信（受信）し（Ｓ１５０６）、＊ｐｃｂＷｒｉｔｔｅｎに送信したデータ数（＊ｐｃｂＲｅａｄに受信したデータ数）を加える（Ｓ１５０７）。この＊ｐｃｂＷｒｉｔｔｅｎの値が図３０または図３１に示すｃｂＢｕｆの値と同じ（＊ｐｃｂＲｅａｄの値が０より大きくｃｂＢｕｆｆｅｒの値以下）である場合（Ｓ１５０８）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１５１０）、ｂＲｅｔをＰＭ３７に返してこの関数を終了する（Ｓ１５１３）。ステップＳ１５０８において、＊ｐｃｂＷｒｉｔｔｅｎの値がｃｂＢｕｆの値より小さい（＊ｐｃｂＲｅａｄの値が０の）場合、ステップＳ１５１０に進む。また、図５のステップＳ５３３または図６のステップＳ６３９でセットしたＷｒｉｔｅ（Ｒｅａｄ）のタイムアウト時間を経過してタイムアウトしている場合も（Ｓ１５０９）、ステップＳ１５１０に進む。ステップＳ１５０９において、タイムアウトしていない場合、ステップＳ１５０４に戻る。ステップＳ１５０５において、アイドル中でない場合、プリンタ３のＵＳＢポート６またはＢｌｕｅｔｏｏｔｈポート８からＮＡＫが返されているかを確認する（Ｓ１５１１）。ＰＣ１からプリンタ３へのデータ転送速度が速く、プリンタ３での印刷制御が間に合わず、プリンタ３の受信バッファがフルとなってしまった場合、プリンタ３で記録紙が不足して記録紙無しエラーが発生し、プリンタ３の受信バッファがフルとなってしまった場合などには、プリンタ３は、ＰＣ１からのデータを受け付けられなくなる。この場合、プリンタ３はＰＣ１にＮＡＫを送信する。ＰＣ１は、プリンタ３とのＢｌｕｅｔｏｏｔｈ通信もしくはＵＳＢ通信の通信リンクが確立されていて正常に通信が行えるときはこのＮＡＫを受信できるが、通信リンクが確立されていない場合などプリンタ３との通信が正常に行えない場合には、ＮＡＫを受信することができない。従って、ステップＳ１５１１において、プリンタ３のＵＳＢポート６またはＢｌｕｅｔｏｏｔｈポート８からＮＡＫが返されているかを確認することにより通信路の異常を判定できる。
【０１０９】
ステップＳ１５１１において、プリンタ３のＵＳＢポート６またはＢｌｕｅｔｏｏｔｈポート８からＮＡＫが返されている場合は、プリンタ３との通信が正常に行えるので、ステップＳ１５０８に進む。ステップＳ１５１１において、ＮＡＫが返されていない場合、ＵＳＢ通信またはＢｌｕｅｔｏｏｔｈ通信に異常があると判断し、ＵＳＢ＿Ｓｅｎｄ（）関数またはＢＴ＿Ｓｅｎｄ１（）関数の場合は未送信データのバッファをクリアして、これ以降の処理における誤送信を防止する（Ｓ１５１２）。その後、ステップＳ１５１３に進みｂＲｅｔをＰＭ３７に返してこの関数を終了する。このように、従来例において、ステップＳ１５０４でＵＳＢインタフェース４またはＢｌｕｅｔｏｏｔｈインタフェース９のアイドル状態を確認する第１の通信状態確認手段が設けられている。この第１の通信状態確認手段は通信リンクが確立していることを前提として、プリンタ３がデータを受信（送信）できる状態にあるかどうかを確認する手段である。
【０１１０】
図２３は図６及び図８で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数の処理を表すフローチャートである。
【０１１１】
同図において、ＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数が開始されると（Ｓ２３０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化し（Ｓ２３０２）、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の状態を確認する（Ｓ２３０３）。通信リンクが確立されている場合（Ｓ２３０４）、通信リンクの切断を試み（Ｓ２３０６）、通信リンクが切断された場合（Ｓ２３０６）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ２３０７）、ｂＲｅｔをＰＭ３７に返してこの関数を終了する（Ｓ２３０８）。ステップＳ２３０６において、通信リンクが切断されなかった場合、ステップＳ２３０８に進みｂＲｅｔを返してこの関数を終了する。ステップＳ２３０４において、通信リンクが確立されていない場合、ステップＳ２３０７に進む。
【０１１２】
図１６は図７で説明したＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数の本実施形態で新たに提案する処理を表すフローチャートである。尚、同図に示す処理は、図５、図２６で説明したＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数としても使えるように設計されている。
【０１１３】
同図において、ＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が開始されると（Ｓ１６０１）、この関数の戻り値となるｂＲｅｔに失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１６０２）。また、ＳｅｔＣｏｍｍＴｉｍｅｏｕｔｓ（）関数をコールし、ＵＳＢ通信またはＢｌｕｅｔｏｏｔｈ通信のＷｒｉｔｅ／Ｒｅａｄのタイムアウト時間を設定する（Ｓ１６１０）。Ｂｌｕｅｔｏｏｔｈ通信かを判定（もしくはＵＳＢ通信かを判定）し、Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１６０３）、Ｂｌｕｅｔｏｏｔｈ通信の接続状態を表す通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）して初期化する（Ｓ１６０４）。そして、図１２で前述したＰＭ３７のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールする（Ｓ１６０５）。ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が成功してＴＲＵＥが返ってきた場合において（Ｓ１６０６）、Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１６０７）、通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをセット（１）し（Ｓ１６０８）、ステップＳ１６０９に進む。ステップＳ１６０９では、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１６０９）、ｂＲｅｔをＳｐｏｏｌｅｒに返してこの関数を終了する（Ｓ１６１１）。ステップＳ１６０３において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ステップＳ１６０５に進む。ステップＳ１６０６において、ＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１６１１に進みｂＲｅｔを返してこの関数を終了する。ステップＳ１６０７において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ステップＳ１６０９に進む。
【０１１４】
図１７は図７で説明したＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２５で説明したＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数の本実施形態で新たに提案する処理を表すフローチャートである。尚、同図に示す処理は、図５、図２６で説明したＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数としても使えるように設計されている。同図において、ステップ内に括弧（  ）で括られた部分があるステップに関しては、括弧で括られている方がＬＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を表し、他方（括弧で括られていない方）がＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数における処理を表す。また、ステップ内に括弧（  ）で括られた部分がないステップに関しては、ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数とＬＭ＿ＲｅａｄＰｏｒｔ（）関数の両者における共通の処理を表す。以下の説明においても、ＬＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を括弧（  ）で括って説明する。
【０１１５】
同図において、ＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＬＭ＿ＲｅａｄＰｏｒｔ（）関数）が開始されると（Ｓ１７０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１７０２）。また、図２７に示すＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の＊ｐｃｂＷｒｉｔｔｅｎ（ＬＭ＿ＲｅａｄＰｏｒｔ（）関数の＊ｐｃｂＲｅａｄ）に０を代入して初期化する（Ｓ１７０３）。Ｂｌｕｅｔｏｏｔｈ通信かを判定（もしくはＵＳＢ通信かを判定）し、Ｂｌｕｅｔｏｏｔｈ通信の場合であり（Ｓ１７０４）、Ｂｌｕｅｔｏｏｔｈ通信の接続状態を表す通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇがセット（１）されている場合（Ｓ１７０５）、図２９に示す通りＣｏｎｔｒｏｌＩＤにＩＯＣＴＬ＿ＢＬＵＥＴＯＯＴＨ＿ＣＯＭＭＵＮＩＣＡＴＩＯＮをセットしてＰＭ３７内のＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数をコールする（Ｓ１７０６）。ＰＭ＿ＧｅｔＰｒｉｎｔｅｒＤａｔａＦｒｏｍＰｏｒｔ（）関数がＰＭ３７からリターンされて図２９に示す＊ｌｐＯｕｔＢｕｆｆｅｒの値がＢｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤの場合（Ｓ１７０７）、図１９で後述するＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）をコールする（Ｓ１７０８）。ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）が成功して成功を表すＴＲＵＥがＰＭ３７から返ってきた場合（Ｓ１７０９）、＊ｐｃｂＷｒｉｔｔｅｎに送信したデータ数（＊ｐｃｂＲｅａｄに受信したデータ数）を代入し（Ｓ１７１０）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１７１１）、ｂＲｅｔをＳｐｏｏｌｅｒに返してこの関数を終了する（Ｓ１７１３）。ステップＳ１７０９において、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１７１３に進みｂＲｅｔを返してこの関数を終了する。ステップＳ１７０７において、＊ｌｐＯｕｔＢｕｆｆｅｒの値がＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ以外の場合、通信状態に異常があると判断して通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）し（Ｓ１７１２）、ステップＳ１７１３に進みｂＲｅｔを返してこの関数を終了する。ステップＳ１７０５において、通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇがクリア（０）されている場合、ステップＳ１７１３に進みｂＲｅｔを返してこの関数を終了する。ステップＳ１７０４において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ステップＳ１７０８に進む。
【０１１６】
図１８は図８で説明したＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数の本実施形態で新たに提案する処理を表すフローチャートである。尚、同図に示す処理は、図５、図２６で説明したＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数としても使えるように設計されている。
【０１１７】
同図において、ＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が開始されると（Ｓ１８０１）、この関数の戻り値となるｂＲｅｔに失敗を表すＦＡＬＳＥを代入して初期化し（Ｓ１８０２）、図１４で前述したＰＭ３７のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数をコールする（Ｓ１８０３）。ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が成功してＰＭ３７からＴＲＵＥが返ってきた場合（Ｓ１８０４）、Ｂｌｕｅｔｏｏｔｈ通信かを判定（もしくはＵＳＢ通信かを判定）する（Ｓ１８０５）。Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１８０５）、Ｂｌｕｅｔｏｏｔｈ通信の接続状態を表す通信接続フラグＢＴ＿Ｃｏｎｎｅｃｔｉｏｎ＿Ｆｌａｇをクリア（０）して初期化し（Ｓ１８０６）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１８０７）、ｂＲｅｔをＳｐｏｏｌｅｒに返してこの関数を終了する（Ｓ１８０８）。ステップＳ１８０５において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、ステップＳ１８０７に進む。ステップＳ１８０４において、ＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１８０８に進みｂＲｅｔを返してこの関数を終了する。
【０１１８】
図１９は図７で説明したＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２５で説明したＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数の本実施形態で新たに提案する処理を表すフローチャートである。尚、同図に示す処理は、図５、図２６で説明したＬＭ３６内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数としても使えるように設計されている。同図において、ステップ内に括弧（  ）で括られた部分があるステップに関しては、括弧で括られている方がＰＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を表し、他方（括弧で括られていない方）がＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数における処理を表す。また、ステップ内に括弧（  ）で括られた部分がないステップに関しては、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数とＰＭ＿ＲｅａｄＰｏｒｔ（）関数の両者における共通の処理を表す。以下の説明においても、ＰＭ＿ＲｅａｄＰｏｒｔ（）関数における処理を括弧（  ）で括って説明する。
【０１１９】
同図において、ＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数）が開始されると（Ｓ１９０１）、この関数の戻り値となるｂＲｅｔに失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ１９０２）。また、図２８に示すＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数の＊ｐｃｂＷｒｉｔｔｅｎ（ＰＭ＿ＲｅａｄＰｏｒｔ（）関数の＊ｐｃｂＲｅａｄ）に０を代入して初期化する（Ｓ１９０３）。次に、Ｂｌｕｅｔｏｏｔｈ通信かを判定（もしくはＵＳＢ通信かを判定）し、Ｂｌｕｅｔｏｏｔｈ通信の場合（Ｓ１９０４）、図２１で後述するＢＴ＿Ｓｅｎｄ２（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数）をコールする（Ｓ１９０５）。ステップＳ１９０４において、Ｂｌｕｅｔｏｏｔｈ通信でない場合（ＵＳＢ通信の場合）、図１５で前述したＵＳＢ＿Ｓｅｎｄ（）関数（ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数）をコールする（Ｓ１９０９）。Ｂｌｕｅｔｏｏｔｈ通信の場合はＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）からＢＴ＿Ｓｅｎｄ２（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数）が、ＵＳＢ通信の場合はＵＳＢ  ＨＷ  （Ｓｔａｃｋ）からＵＳＢ＿Ｓｅｎｄ（）関数（ＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数）が成功して成功を表すＴＲＵＥが返ってきた場合（Ｓ１９０６）、＊ｐｃｂＷｒｉｔｔｅｎに送信したデータ数（＊ｐｃｂＲｅａｄに受信したデータ数）を代入し（Ｓ１９０７）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ１９０８）、ｂＲｅｔをＬＭ３６に返してこの関数を終了する（Ｓ１９１０）。ステップＳ１９０６において、ＢＴ＿Ｓｅｎｄ２（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数）が失敗して失敗を表すＦＡＬＳＥが返ってきた場合、ステップＳ１９１０に進みｂＲｅｔを返してこの関数を終了する。
【０１２０】
図２０は図７、図２５で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数の本実施形態で新たに提案する処理を表すフローチャートである。
【０１２１】
同図において、ＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数が開始されると（Ｓ２００１）、この関数の戻り値となるｄｗＲｅｔ  にＢｌｕｅｔｏｏｔｈ通信の通信リンクが切断されていることを表すＢＬＵＥＴＯＯＴＨ＿ＤＩＳＣＯＮＮＥＣＴＥＤを代入して初期化する（Ｓ２００２）。そして、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の状態を確認し（Ｓ２００３）、通信リンクが確立されていて正常な状態である場合（Ｓ２００４）、ｄｗＲｅｔにＢｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤを代入し（Ｓ２０１２）、ｄｗＲｅｔをＰＭ３７に返してこの関数を終了する（Ｓ２０１４）。ステップＳ２００４において、通信リンクが正常に確立されていない場合、プリンタ３のＢｌｕｅｔｏｏｔｈポート８から通信切断の要求を表す通信切断要求パケットが送られてきたかどうかを確認し（Ｓ２００５）、通信切断要求パケットが送られてきた場合（Ｓ２００６）、図２３で示すＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数をコールして通信リンクを切断し（Ｓ２０１３）、ステップＳ２０１４に進みｄｗＲｅｔを返してこの関数を終了する。このケースのようにプリンタ３のＢｌｕｅｔｏｏｔｈポート８から通信切断要求パケットが送られてくるケースとしては、例えば、印刷中にユーザがプリンタ３の電源スイッチを操作して強制的にプリンタ３の電源をオフにするケース等が考えられる。ステップＳ２００６において、通信切断要求パケットが送られてきていない場合、Ｂｌｕｅｔｏｏｔｈ通信のリカバリー処理を行う（Ｓ２００７）。このケースとしては、例えば、印刷中にＢｌｕｅｔｏｏｔｈの無線通信の電波状況が悪くなって通信リンクが確立されているのか、切断されているのかが不明な状態に陥っているケース等が考えられる。ステップＳ２００７において、Ｂｌｕｅｔｏｏｔｈ通信のリカバリー処理が成功した場合（Ｓ２００８）、ｄｗＲｅｔに、Ｂｌｕｅｔｏｏｔｈ通信がリカバリーされ、通信リンクが確立されて正常な状態に復帰したことを表すＢＬＵＥＴＯＯＴＨ＿ＲＥＣＯＶＥＲＥＤを代入し（Ｓ２００９）、ステップＳ２０１４に進みｄｗＲｅｔをＰＭ３７に返してこの関数を終了する。ステップＳ２００８において、Ｂｌｕｅｔｏｏｔｈ通信のリカバリー処理が失敗した場合、Ｂｌｕｅｔｏｏｔｈ通信の仕様においてデバイス（プリンタ３のＢｌｕｅｔｏｏｔｈポート８）からの応答がなくなってから通信リンクを維持することができる最大時間を経過しておらず、リカバリー中の場合（Ｓ２０１０）、ｄｗＲｅｔにＢｌｕｅｔｏｏｔｈ通信の通信リンクが確立されているのか切断されているのかが不明な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＵＮＫＮＯＷＮを代入し（Ｓ２０１１）、ステップＳ２０１４に進みｄｗＲｅｔをＰＭ３７に返してこの関数を終了する。ステップＳ２０１０において、前記最大時間を経過してリカバリーが不可能になった場合、ステップＳ２０１３に進む。
【０１２２】
以上説明したように、図７、図２５に示す本実施形態で新たに設けたＬＭ３６におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段（第２の通信状態確認手段）により、同図に示すＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数の処理が実行される。プリンタドライバ５０はこの第２の通信状態確認手段を利用してＰＣ１からプリンタ３への安全なデータ送信を制御する、という点が特徴的な新規技術である。このＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段のロジックは、図１５、図２１で示すようなＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）におけるＢｌｕｅｔｏｏｔｈ通信の通信リンクの通信状態確認手段（第１の通信状態確認手段）のロジックと異なるものである。一度でも、Ｂｌｕｅｔｏｏｔｈ通信がリカバリーされ、通信リンクが確立されて正常な状態に復帰したことを表すＢＬＵＥＴＯＯＴＨ＿ＲＥＣＯＶＥＲＥＤや、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されているのか切断されているのかが不明な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＵＮＫＮＯＷＮとなった場合、これらの状態に至る前にＢｌｕｅｔｏｏｔｈ通信の通信リンクが一度切断されている可能性がある。そのため本実施形態においては、プリンタ３における不正な印字等の誤動作を防止する為に、図７のステップＳ７２８や図２５のステップＳ２５１１において、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクが確立されていて正常な状態であることを表すＢＬＵＥＴＯＯＴＨ＿ＣＯＮＮＥＣＴＥＤ以外のケース（ＢＬＵＥＴＯＯＴＨ＿ＲＥＣＯＶＥＲＥＤ、ＢＬＵＥＴＯＯＴＨ＿ＵＮＫＮＯＷＮ、ＢＬＵＥＴＯＯＴＨ＿ＤＩＳＣＯＮＮＥＣＴＥＤ）を全てエラーとして処理している。
【０１２３】
図２１は図７で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｓｅｎｄ２（）関数と、図２５で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｒｅｃｅｉｖｅ２（）関数の本実施形態で新たに提案する処理を表すフローチャートである。同図において、ステップ内に括弧（  ）で括られた部分があるステップに関しては、括弧で括られている方がＢＴ＿Ｒｅｃｅｉｖｅ２（）関数における処理を表し、他方（括弧で括られていない方）がＢＴ＿Ｓｅｎｄ２（）関数における処理を表す。また、ステップ内に括弧（  ）で括られた部分がないステップ（但し、ステップＳ２１１６を除く）に関しては、ＢＴ＿Ｓｅｎｄ２（）関数とＢＴ＿Ｒｅｃｅｉｖｅ２（）関数の両者における共通の処理を表す。以下の説明においても、ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数における処理を括弧（  ）で括って説明する。
【０１２４】
同図において、ＢＴ＿Ｓｅｎｄ２（）関数（ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数）が開始されると（Ｓ２１０１）、この関数の戻り値となるｂＲｅｔ  に失敗を表すＦＡＬＳＥを代入して初期化する（Ｓ２１０２）。また、図３１に示すＢＴ＿Ｓｅｎｄ２（）関数の＊ｐｃｂＷｒｉｔｔｅｎ（ＢＴ＿Ｒｅｃｅｉｖｅ２（）関数の＊ｐｃｂＲｅａｄ）に０を代入して初期化する（Ｓ２１０３）。そして、図２０に示すＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数をコールして、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の状態を確認する（Ｓ２１０４）。通信リンクが既に確立されている場合（Ｓ２１０５）、プリンタ３が接続されているＵＳＢインタフェース４またはＢｌｕｅｔｏｏｔｈインタフェース９のアイドル状態を確認する（Ｓ２１０８）。
【０１２５】
アイドル中の場合（２１０９）、データパケットを送信（受信）し（Ｓ２１１０）、＊ｐｃｂＷｒｉｔｔｅｎに送信したデータ数（＊ｐｃｂＲｅａｄに受信したデータ数）を加え（Ｓ２１１１）、＊ｐｃｂＷｒｉｔｔｅｎの値が図３１に示すｃｂＢｕｆの値と同じ（＊ｐｃｂＲｅａｄ  の値が０より大きくｃｂＢｕｆｆｅｒの値以下）かを判定する（Ｓ２１１２）。＊ｐｃｂＷｒｉｔｔｅｎの値が図３１に示すｃｂＢｕｆの値と同じ場合（Ｓ２１１２）、ｂＲｅｔに成功を表すＴＲＵＥを代入し（Ｓ２１１４）、ｂＲｅｔをＰＭ３７に返してこの関数を終了する（Ｓ２１１７）。ステップＳ２１１２において、＊ｐｃｂＷｒｉｔｔｅｎの値がｃｂＢｕｆの値より小さい（＊ｐｃｂＲｅａｄ  の値が０の）場合であり、図６のステップＳ６３９でセットしたＷｒｉｔｅ（Ｒｅａｄ）のタイムアウト時間を経過してタイムアウトしている場合（Ｓ２１１３）、ステップＳ２１１４に進む。ステップＳ２１１３において、タイムアウトしていない場合、ステップＳ２１０８に戻る。ステップＳ２１０９において、アイドル中でない場合、プリンタ３のＢｌｕｅｔｏｏｔｈポート８からＮＡＫが返されているかを確認する（Ｓ２１１５）。図１５で説明したように、プリンタ３のＵＳＢポート６またはＢｌｕｅｔｏｏｔｈポート８からＮＡＫが返されているかを確認することにより通信路の異常を判定する。ＮＡＫが返されている場合（Ｓ２１１５）、Ｂｌｕｅｔｏｏｔｈ通信が正常に行えているので、ステップＳ２１１２に進む。ステップＳ２１１５において、ＮＡＫが返されていない場合、Ｂｌｕｅｔｏｏｔｈ通信に異常があると判断し、ＢＴ＿Ｓｅｎｄ２（）関数の場合は未送信データのバッファをクリアして、これ以降の処理における誤送信を防止する（Ｓ２１１６）。そして、ステップＳ２１１７に進み、ｂＲｅｔをＰＭ３７に返してこの関数を終了する。ステップＳ２１０５において、通信リンクが確立されていない場合、図２２に示すＢＴ＿Ｃｏｎｎｅｃｔ（）関数をコールして、Ｂｌｕｅｔｏｏｔｈ通信の通信リンク（ＡＣＬとＨＣＲＰ）の確立を試みる（Ｓ２１０６）。通信リンクが確立された場合（Ｓ２１０７）、ステップＳ２１０８に進む。ステップＳ２１０７において、通信リンクが確立されなかった場合、ステップＳ２１１６に進む。
【０１２６】
このように、本実施形態で新たに提案する処理においても、図１５に示す従来例と同様に、ステップＳ２１０８でＢｌｕｅｔｏｏｔｈインタフェース９のアイドル状態を確認する第１の通信状態確認手段が設けられている。この第１の通信状態確認手段は通信リンクが確立していることを前提として、プリンタ３がデータを受信（送信）できる状態にあるかどうかを確認する手段である。
【０１２７】
また、ステップＳ２１０４において、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクの状態を確認し、通信リンクが確立されていない場合はステップＳ２１０６で通信リンクを（再度）確立してリカバリーすることで、印刷中に通信が滞ったり切断されたりするケースにおいても、通信が切断される度に印刷ジョブをエラー終了することなく、印刷ジョブを続行して完了することもできる。これにより、図６に示す従来例では、印刷開始時にステップＳ６０５においてＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数をコールした時に、ステップＳ６１１で行われていたＢｌｕｅｔｏｏｔｈ通信の通信リンクを確立する処理が、図７のステップＳ７１８等のＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数をコールした時、図２５のステップＳ２５０１等のＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数をコールした時にもステップＳ２１０６でも行われる。従って、例えば、印刷中にＢｌｕｅｔｏｏｔｈ通信の無線通信の電波状況が悪くなって通信リンクが切断された場合等においても、印刷ジョブをエラー終了することなく、最後まで確実に印刷を完了することができる。このリカバリー処理は、図２０のステップＳ２００７で行うリカバリー処理とは異なるロジックである。このようにロジックの異なる２つ（複数）のリカバリー処理、すなわち、Ｂｌｕｅｔｏｏｔｈ通信の通信リンクの再確立処理を行うことは、特徴的な新規技術である。
【０１２８】
以下、図３３に示すメモリマップを参照して、上記実施形態に係る情報処理装置及び周辺装置からなる周辺装置制御システムで読み出し可能なデータ処理プログラムの構成について説明する。
【０１２９】
図３３は、本実施形態に係る周辺装置制御システムで読み出し可能な各種データ処理プログラムを格納する記憶媒体のメモリマップを示す図である。なお、特に図示しないが、記憶媒体に記憶されるプログラム群を管理する情報、例えばバージョン情報，作成者等もこの記憶媒体に記憶され、かつ、プログラム読み出し側のＯＳ等に依存する情報、例えばプログラムを識別表示するアイコン等も記憶される場合もある。
【０１３０】
６４は記憶媒体であり、ここではハードディスクで構成されているものとする。６５はディレクトリ情報管理部であり、各種プログラムに従属するデータがこのディレクトリ情報管理部６５で管理されている。６６はプログラム格納部であり、各種プログラムを情報処理装置にインストールするためのプログラムや、インストールするプログラムが圧縮されている場合に解凍するためのプログラム等も記憶される場合がある。本発明の実施の形態における図５〜図８、図２４〜図２６にそれぞれ示す各関数フロー、及び、図９〜図２３にそれぞれ示す各フローチャートで実現される処理は、このプログラム格納部６６に記憶されており、それぞれ実行される。これらの各関数フロー及び各フローチャートの実行によって実現できる各機能が、外部からインストールされるプログラムによって、情報処理装置によって実現されるようにしてもよい。そして、その場合、ＣＤ−ＲＯＭやフラッシュメモリやフレキシブルディスク等の記憶媒体により、あるいはネットワークを介して外部の記憶媒体から、プログラムを含む情報群が情報処理装置や周辺装置に供給される場合でも、本発明は適用されるものである。
【０１３１】
上記実施の形態では、アプリケーション３０の例としてメモ帳／Ｎｏｔｅｐａｄ（Ｎｏｔｅｐａｄ．ｅｘｅ）のような印刷可能なアプリケーションやステータスモニタを挙げたが、これらの例に限られることなく、例えば印刷機能を備える任意のアプリケーションや、周辺装置から情報を取得して、それを利用するような任意のアプリケーションで実現可能であり、有効である。
【０１３２】
また、上記実施の形態では、アプリケーション（ステータスモニタ）３０でプリンタ３に搭載されているインクの情報及び状態をモニタする例を説明したが、この例に限られることなく、例えば、周辺装置の動作状態や、警告、エラーの状態、オプションの装着状態等の任意の情報や状態の取得に有効活用できる。
【０１３３】
また、上記実施の形態では、プリンタの例としてカラーインクジェットプリンタを使用したが、この例に限られることなく、例えば、モノクロＬＢＰ等の任意のプリンタを使用することができる。
【０１３４】
また、上記実施の形態では、情報処理装置としてパーソナルコンピュータを想定したが、この例に限られることなく、例えばデジタルカメラ、デジタルビデオカメラ、ＤＶＤビデオプレーヤー、ゲーム、セットトップボックス、インターネット家電等、同様な使用方法が可能な任意の端末に対して実現することができ、有効である。
【０１３５】
また、上記実施の形態では、周辺装置としてプリンタを例示しているが、周辺装置として他に、複写機、ファクシミリ、スキャナ、デジタルカメラ、デジタルビデオカメラ、及びこれらの複合機能を備える装置などのいずれかが、本発明の適用対象となり得る。
【０１３６】
また、上記実施の形態では、ＯＳに例としてＷｉｎｄｏｗｓ（登録商標）  ＸＰを使用したが、このＯＳに限られることなく、任意のＯＳを使用することができる。
【０１３７】
また、上記実施の形態では、ＰＣ１とプリンタ３との間のインタフェースとして、Ｂｌｕｅｔｏｏｔｈインタフェースを用いたが、このインタフェースに限られることなく、例えば、無線ＬＡＮ（ＩＥＥＥ  ８０２．１１ａ／ｂ／ｇ等）、Ｗｉｒｅｌｅｓｓ  ＵＳＢ  Ｐｒｏｍｏｔｅｒ  Ｇｒｏｕｐが策定したＷｉｒｅｌｅｓｓ  ＵＳＢ等の任意の無線インタフェースを用いるようにしてもよい。
【０１３８】
上記説明によれば、無線通信を利用した印刷システムにおいて、印刷ジョブを印刷中に、例えば、無線通信の電波状況が悪くなって通信リンクが切断された場合、継続された印刷ジョブ内の印刷制御コマンドによってプリンタが不正な印字等の誤動作をしないように防止することができる。
【０１３９】
また、無線通信を利用した周辺装置の状態をモニタする機能（ステータスモニタ）において、例えば、無線通信の電波状況が悪くなって通信リンクが確立されているのか、切断されているのかが不明な状態の時にも、ステータスモニタが制御不能な状態に陥ることなく安定した状態を継続することができ、操作性を向上することができる。
【０１４０】
また、本発明の目的は、前述した実施の形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読み出し実行することによっても、達成されることは言うまでもない。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、プログラムコード自体及びそのプログラムコードを記憶した記憶媒体は本発明を構成することになる。プログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカード、ＲＯＭ等を用いることができる。また、コンピュータが読み出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼動しているＯＳ（基本システム或いはオペレーティングシステム）などが実際の処理の一部又は全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵ等が実際の処理の一部又は全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
【図面の簡単な説明】
【０１４１】
【図１】本発明の実施形態における情報処理装置及び周辺装置からなる周辺装置制御システムの構成を示すブロック図
【図２】本発明の実施形態におけるＰＣのハードウェア構成の一例を表すブロック図
【図３】本発明の実施形態におけるプリンタのハードウェア構成を表すブロック図
【図４】本発明の実施形態におけるＰＣにおけるプリンタドライバの構成を表すブロック図
【図５】本発明の実施形態におけるＵＳＢインタフェース４を介して印刷を行った時の関数フローを表す図
【図６】Ｂｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の従来例の関数フローを表す図
【図７】本発明の実施形態におけるＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の関数フローを表す図
【図８】本発明の実施形態におけるＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の関数フローを表す図
【図９】図５及び図６で説明したＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数の処理を表すフローチャート
【図１０】図５及び図６で説明したＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２４で説明したＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数の処理を表すフローチャート
【図１１】図５及び図６で説明したＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数の処理を表すフローチャート
【図１２】図５及び図６で説明したＰＭ３７内のＰＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数の処理を表すフローチャート
【図１３】図５及び図６で説明したＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２４で説明したＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数の処理を表すフローチャート
【図１４】図５及び図６で説明したＰＭ３７内のＰＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数の処理を表すフローチャート
【図１５】図５及び図６で説明したＵＳＢ  ＨＷ  （Ｓｔａｃｋ）内のＵＳＢ＿Ｓｅｎｄ（）関数及びＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｓｅｎｄ１（）関数と、図２６及び図２４で説明したＵＳＢ  ＨＷ  （Ｓｔａｃｋ）内のＵＳＢ＿Ｒｅｃｅｉｖｅ（）関数及びＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｒｅｃｅｉｖｅ１（）関数の処理を表すフローチャート
【図１６】図７で説明したＬＭ３６内のＬＭ＿ＳｔａｒｔＤｏｃＰｏｒｔ（）関数の新たに提案する処理を表すフローチャート
【図１７】図７で説明したＬＭ３６内のＬＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２５で説明したＬＭ３６内のＬＭ＿ＲｅａｄＰｏｒｔ（）関数の新たに提案する処理を表すフローチャート
【図１８】図８で説明したＬＭ３６内のＬＭ＿ＥｎｄＤｏｃＰｏｒｔ（）関数の新たに提案する処理を表すフローチャート
【図１９】図７で説明したＰＭ３７内のＰＭ＿ＷｒｉｔｅＰｏｒｔ（）関数と図２５で説明したＰＭ３７内のＰＭ＿ＲｅａｄＰｏｒｔ（）関数の新たに提案する処理を表すフローチャート
【図２０】図７、図２５で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿ＣｈｅｃｋＣｏｎｎｅｃｔｉｏｎ（）関数の新たに提案する処理を表すフローチャート
【図２１】図７で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｓｅｎｄ２（）関数と、図２５で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｒｅｃｅｉｖｅ２（）関数の新たに提案する処理を表すフローチャート
【図２２】図６及び図７で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｃｏｎｎｅｃｔ（）関数の処理を表すフローチャート
【図２３】図６及び図８で説明したＢｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）内のＢＴ＿Ｄｉｓｃｏｎｎｅｃｔ（）関数の処理を表すフローチャート
【図２４】図３２のステータスモニタを起動した状態でＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の従来例の関数フローを表す図
【図２５】図３２のステータスモニタを起動した状態でＢｌｕｅｔｏｏｔｈインタフェース９を介して印刷を行った時の新たに提案する関数フローを表す図
【図２６】図３２のステータスモニタを起動した状態でＵＳＢインタフェース４を介して印刷を行った時の関数フローを表す図
【図２７】ＬＭ３６がエクスポートしている関数の定義を表す図
【図２８】ＰＭ３７がエクスポートしている関数の定義を表す図
【図２９】ＰＭ３７がエクスポートしている関数とこの関数が使用する新たに提案する定数の定義を表す図
【図３０】ＵＳＢ  ＨＷ  （Ｓｔａｃｋ）がエクスポートしている関数の定義を表す図
【図３１】Ｂｌｕｅｔｏｏｔｈ  ＨＷ  （Ｓｔａｃｋ）がエクスポートしている関数の定義を表す図
【図３２】プリンタの状態をモニタするステータスモニタを表す図
【図３３】周辺装置制御システムで読み出し可能な各種データ処理プログラムを格納する記憶媒体のメモリマップを示す図
【符号の説明】
【０１４２】
１  情報処理装置（ＰＣ）
３  プリンタ
４  ＵＳＢインタフェース
５  ＵＳＢポート
６  ＵＳＢポート
７  Ｂｌｕｅｔｏｏｔｈポート
８  Ｂｌｕｅｔｏｏｔｈポート
９  Ｂｌｕｅｔｏｏｔｈインタフェース
３０  アプリケーション（メモ帳／Ｎｏｔｅｐａｄ（Ｎｏｔｅｐａｄ．ｅｘｅ）、ステータスモニタ）
３６  ランゲージモニタ（ＬＭ）
３７  ポートモニタ（ＰＭ）
【図１】
2006331179.tif 000003
【図２】
2006331179.tif 000004
【図３】
2006331179.tif 000005
【図４】
2006331179.tif 000006
【図５】
2006331179.tif 000007
【図６】
2006331179.tif 000008
【図７】
2006331179.tif 000009
【図８】
2006331179.tif 000010
【図９】
2006331179.tif 000011
【図１０】
2006331179.tif 000012
【図１１】
2006331179.tif 000013
【図１２】
2006331179.tif 000014
【図１３】
2006331179.tif 000015
【図１４】
2006331179.tif 000016
【図１５】
2006331179.tif 000017
【図１６】
2006331179.tif 000018
【図１７】
2006331179.tif 000019
【図１８】
2006331179.tif 000020
【図１９】
2006331179.tif 000021
【図２０】
2006331179.tif 000022
【図２１】
2006331179.tif 000023
【図２２】
2006331179.tif 000024
【図２３】
2006331179.tif 000025
【図２４】
2006331179.tif 000026
【図２５】
2006331179.tif 000027
【図２６】
2006331179.tif 000028
【図２７】
2006331179.tif 000029
【図２８】
2006331179.tif 000030
【図２９】
2006331179.tif 000031
【図３０】
2006331179.tif 000032
【図３１】
2006331179.tif 000033
【図３２】
2006331179.tif 000034
【図３３】
2006331179.tif 000035