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

如果您只想打印一条水平线,那么我认为创建新字体可能不是要走的路。相反,请考虑制作一个仅是一条水平线的图形,然后像任何其他图形一样打印它。

您也可以尝试将终端置于图形模式并手动绘制它,尽管这需要更多的努力。从文档(强调添加):

在打点图形模式下,主机几乎可以完全控制机构,可以在任何网点位置打印网点……横向和纵向打印密度为每毫米八点。在点图形模式中,可打印字符被细分为两组字符——可打印位模式和终止符。种类繁多的行终止符决定了接收位模式的打印方式。

图形图像一次构建一个点线,一次通过。打印一行图像后,进纸一行。图像的数据以 6 位增量顺序呈现。第 8 位取决于奇偶校验;第 7 位始终为 1;其余位是图形图像位。对于图形图像位,位 6 是最左边的位,位 0 是最右边的位。发送的第一个代码代表最左边的托架位置,最后一个字符代表最右边的托架位置,依此类推。

由于机制配置,图像数据格式构造为每点线 384 个点。主机每点线最多可发送 64 个图像代码和一个终止代码。

注意:图像代码不得小于十六进制数 40;终止符不得小于十六进制数 20。

所以打印字符被定义为 P 1 G G G G G G 其中P =“由字格式定义的奇偶校验”,1=常量1,G是图形位

终止符 char 定义为 P 0 1 0 EXIT X X FEED其中 P = "Parity as defined by word format", 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 回答