如何在verifone vx520中打印连接字符?

时间:2016-05-09 13:58:55

标签: point-of-sale verifone

我想在_____等打印纸上画一条线,下面的图片是我的字体位图font bitmaps

我使用此代码下载并选择我的字体到打印机和打印字符

#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;
}

但结果是下面的图像,并且字符没有连接在一起。我该如何解决这个问题? result

1 个答案:

答案 0 :(得分:2)

如果您只想打印一条水平线,那么我认为创建一个新字体可能不是可行的方法。相反,请考虑制作一个只是水平线的图形并将其打印like any other graphic

您也可以尝试将终端设置为图形模式并手动绘制,但这需要花费更多精力。从文档(重点添加):

  

在点图形模式下,主机几乎可以完全控制机构,并可以在任何点位置打印点...水平和垂直打印密度为每毫米8个点。在点图形模式下,可打印字符被细分为两组字符 - 可打印位模式和终止符。各种各样的行终止符决定了接收位模式的打印方式。

     

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

     

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

     

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

因此打印字符被定义为 P 1 G G G G G G 其中P =&#34;奇偶校验由字格式&#34;定义,1 =常数1,G是图形位

终结符char被定义为 P 0 1 0 EXIT X X FEED其中P =&#34;奇偶校验由字格式&#34;定义,0是常数0,1是常数1,&#34; EXIT&#34;允许你退出图形模式(0 =不退出,1 =退出),X被忽略,&#34; FEED&#34;允许您发送换行符。

我不确定此示例代码是否可以按原样运行,但如果你想使用它,它至少应该让你开始:

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。