テクニカルノート18: シリアルポートへプリント

Jun 20, 2002

© NSB Corporation. All rights reserved.

Go to English page.

Geneer Corporation (Des Plaines, IL), ソフトウエア開発のDaniel Kurtz氏による寄稿。(dkurtz© geneer.com)

Commコントロールは 9600, N, 8, 1 と構成すべきです(他のスピードでは動作しません);DTREnable = false, handshaking = 2, InputLen = 0, InputMode = false, NullDiscard = False, ParityReplace = ?, RTThreshold = 1, RTSEnable = False, SThreshold = 0。

プリント作業を始める際、ポートがまだ開いていない場合は、PortOpen = True メソッドを使用してポートを開いて下さい。そして、Outputメソッドを使用して、各ライン毎にポートへ書いて下さい。vbCRLFで各ラインを終えて下さい。

本当に必要であるかどうかは確信がないが、それぞれの新しいラインでポートバッファを上書きする可能性を排除するために、以下のように、各ラインの後でバッファをきれいにします。

            ' Make sure the commport buffer is clear.
            Do While Comm1.OutBufferCount > 0
            Loop

いったんある量のデータがバッファに入ると(各ラインおよそ90バイトの長さで、およそ60ラインを出力した後)、バッファがオーバーランする事が分かりました。このケースでのバッファのオーバーランはプリンタによるものであると確信しています。ですから、この問題は使用しているプリンタとそれが持っているメモリの容量によって異なってきます。私が出来た唯一の処理の方法は、さらにデータを送る前にバッファをきれいにするよう、数秒間の任意の一時休止を導入しました。

            ' We delay an arbitrary number of seconds to make sure
            ' the print input buffer is clear before continuing.
            intDelay = Time()
            Do While Time() < DateAdd("s", PRINT_DELAY, intDelay)
            Loop

PRINT_DELAYは30にしています。必要な遅延の長さはデバイス毎に違うでしょう。私は使用しているSH3-based Casiosで何度も試してみて、この値にたどり着きました。Hewlett-Packardでこのアプリケーションを動作させるには、この遅延の値はあまり短すぎない方がいいようです。 これによる結果は1ページ当たり(約60行)約30秒の遅れがでるため、頭が痛いがところですが、限られた時間の中では、より優れた解決策が引き出せませんでした。もしあなたがシリアルコミュニケーションがどのように行われているかをご存じでしたら、ハンドシェイク(handshake)等を使って他の方法を見つける事が出来るかもしれません。それによりコントロールはプリンタがデータを受ける準備が出来ているかを知る事が出来るでしょう。(さらにプリンタが接続されているかどうかも、知らせるでしょう。)全てのテストおよびプリントはserial-parallel converterを通して行っています。私の古いLaserJetはシリアルポートがついていますが、最近のプリンタは使用していないのが多いようです。ですからserial-parallel converterを使用することにしました。

先にも述べましたが、送信コントロールのコードからドライバの動きを理解しない限り、フォーマットなどの特別なものはありません。私のスペックは簡単なファイルのダンプ(dump)のようなものを呼びますので、vbCRLFで各ラインが終る一般的なASCIIテキストを使いました。空白行をプリントするには、一つのvbCRLFだけを送って下さい。ページ番号にはvbFormFeedを使い、プリンタのバッファから最後のページをクリアするにはvbFormFeedを使います。

アウトプットが終了し、ポートがもう必要でない場合に、PortOpen = Falseメソッドを使用して、それを閉じることができます。commポートをプリントに使うことに加え、我々はバーコードスキャナーからの入力を受けるのにも使います。この場合、コミュニケーションのパラメータは異なります。すなわち、スキャナーの設定はプリントを許容せず、プリントの設定はスキャナーの機能を許容しません。このような場合、再構成してそれぞれの機能を生かすためにをポートを一旦閉じ、再度開く必要があります。次の2つの内からどちらかの方法をえらべます:1)一つのCommコントロールを使用する場合、それを閉じ、プロパティを再構成し、再度ひらきます。2)二つのCommコントロールを使用する場合、特定のタスクの為に、それぞれを再構成する。プリントする際、初めにスキャナのコントロールでポートを閉じ、それからプリンタのコントロールでそれを開きます。終る時に、プリンタのコントロールでポートを閉じ、それからスキャナのコントロールで再度開きます。最初のポートがまだ開いているならば、別のコントロールでポートを開くことはできませんし、コントロールがまだポートを開いている場合、異なった構成でそのコントロールを再度開くことはできません。残念ながら、実行時にPortOpen = Falseは信頼がおけるほど正しく動作しないようです。私の経験から、(VBCE 6 beta に含まれるバージョンのコントロールを使用した場合)最終的には動きますが、常に最初の試みでうまくいくとはいえません。ですから、commポートを閉じて再度開く時には、以下のようなループの中に入れます。

          For intCommAttempts = 1 To 1000
            Comm2.PortOpen = False
            Comm1.PortOpen = True
            If Comm1.PortOpen Then
              Exit For
            End If
          Next

1000回試みて達成しない場合は、エラーをレポートするようにしています。いままで実行時にエラーのリポートはありませんので、以下のようにも出来ると思います。

do while Comm2.PortOpen
   Comm2.PortOpen = False
 loop
 Comm1.PortOpen = True

Geneerについて (http:// www.Geneer.com)

Geneer(www.geneer.com)は1984年に設立されて以来、生まれようとしている新しいソフトウェア技術を実現させるパイオニアとしてよく認識されています。製造、金融、通信、生命科学の分野の成功を遂げている500社の為に、ソフトウェアを開発し、それらのクライアントが、より速い市場確保を伴った競争力において有利な立場を達成するのを助けきています。デザインから配送まで, GeneerのCode Scienceと呼ばれるその立証されたセットの規律への固守は、クライアントにプロジェクトスケジュール、品質、およびコストの最適なコントロールを維持させます。現在180人以上の従業員と共に、最近のGeneer software partnershipsは、Dow AgroSciences、Eli Lilly、USDATA、Giddings & Lewis、Packard Instruments、AT&T、Omron Electronics、ACNielsen、Lucent Technologies、First American Title Insurance、GE Fanucが含まれています。