0

私は_____のような印刷された紙に線を描きたいと思っています。下の写真は私のフォントビットマップですフォント ビットマップ

このコードを使用して、フォントをダウンロードしてプリンターに選択し、文字を印刷します

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <svc.h>
#include <printer.h>

int main() {
    int retVal;
    int handle;
    open_block_t parm;
    int h_font_file;
    char print[32] = {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43};

    handle = open("/dev/com4", 0);

    memset(&parm, 0, sizeof (parm));
    parm.rate = Rt_19200;
    parm.format = Fmt_A8N1 | Fmt_auto | Fmt_RTS;
    parm.protocol = P_char_mode;
    parm.parameter = 0;
    set_opn_blk(handle, &parm);
    SVC_WAIT(200);
    p3700_init(handle, 6);
    SVC_WAIT(100);

    /****************SETUP FONT******************/
    h_font_file = open("8x16.pft", O_RDONLY); //load font
    retVal = p3700_dnld_font_file(handle, h_font_file, 2); //set font
    SVC_WAIT(100);
    retVal = p3700_select_font(handle, 0x03, 2);


    retVal = write(handle, print, 32);

    printf("printf: %d\n", retVal);

    retVal = write(handle, "\n\n\n\n", 4);

    SVC_WAIT(100);

    return 0;
}

しかし、結果は下の画像で、文字はつながっていません。この問題を解決するにはどうすればよいですか? 結果

4

1 に答える 1

2

水平線を印刷するだけなら、新しいフォントを作成するのはおそらく適切ではないと思います。代わりに、単なる横線のグラフィックを作成し、他のグラフィックと同じように印刷することを検討してください。

端末をグラフィック モードにして手動で描画することもできますが、これにはさらに手間がかかります。ドキュメントから(強調を追加):

ドット グラフィック モードでは、ホストがメカニズムをほぼ完全に制御し、任意のドット位置にドットを印刷できます。水平および垂直の印刷密度は、1 mm あたり 8 ドットです。ドット グラフィックス モードでは、印刷可能な文字は、印刷可能なビット パターンとターミネータという 2 つのグループの文字に分割されます。さまざまなライン ターミネータによって、受信したビット パターンの印刷方法が決まります。

グラフィック イメージは、1 回のパスで一度に 1 ドット ラインずつ作成されます。画像が 1 行印刷されると、1 ドット行分紙送りされます。画像のデータは、6 ビット単位で順次表示されます。ビット 8 はパリティに依存します。ビット 7 は常に 1 です。残りのビットはグラフィック イメージ ビットです。グラフィック イメージ ビットの場合、ビット 6 が左端のビットで、ビット 0 が右端です。送信された最初のコードは、一番左のキャリッジ位置を表し、最後の文字は一番右のキャリッジ位置などを表します。

機構の構成上、画像データのフォーマットは1ドットラインあたり384ドットで構成されています。ホストは、ドット ラインごとに最大 64 のイメージ コードと 1 つのターミネータ コードを送信できます。

注: イメージ コードは 16 進数の 40 未満であってはなりません。ターミネータは 16 進数の 20 未満であってはなりません。

したがって、印刷文字は次のように定義されます。 P 1 G G G G G G ここで、P = "ワード形式で定義されたパリティ"、1 = 定数 1、G はグラフィック ビットです。

ターミネータ char は次のように定義されます P 0 1 0 EXIT X X FEED。P = 「ワード形式で定義されたパリティ」、0 は定数 0、1 は定数 1、「EXIT」でグラフィック モードを終了できます (0 = 終了しない、1 = exit)、X は無視され、"FEED" で改行を送信できます。

このサンプル コードがそのまま機能するかどうかはわかりませんが、試してみたい場合は、少なくとも開始する必要があります。

char line[65]; /* room for 64 image codes + 1 terminator code 
                 (if using all 64, no line feed should be used
                  as it will drop down on its own) */
memset(line, 0, sizeof(line));

// ENTER GRAPHICS MODE
line[0] = ESC; // ESC is defined as 0x1B
line[1] = 'g';
p350_print(hPrinter, line);

for(int i = 0; i<sizeof(line); i++)
    line[i] = 0x7F;

line[sizeof(line)-1] = 0x29;
p350_print(hPrinter, line);

最後の注意: グラフィック モードを使用する、かなり前に書いたコードを見ていましたが、パリティに注意を払っているようには見えません。 0.

于 2016-05-18T19:22:20.967 に答える