Как напечатать связанный символ в розыгрыше vx520?

Я хочу нарисовать линию на печатной бумаге, как _____, и рисунок ниже - это мой растровый рисунок шрифта. растровые шрифты

и я использую этот код для загрузки и выбора шрифта для принтера и печати символов

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

но в результате изображение ниже и символы не связаны друг с другом. Как я могу исправить эту проблему? результат

1 ответ

Если все, что вы хотите сделать, это напечатать горизонтальную линию, то я думаю, что создание нового шрифта, вероятно, не лучший способ. Вместо этого рассмотрите возможность создания графики, которая представляет собой просто горизонтальную линию, и распечатайте ее, как любую другую графику.

Вы также можете попробовать перевести терминал в графический режим и нарисовать его вручную, хотя это потребует больше усилий. Из документации (выделение добавлено):

В режиме точечной графики хост имеет почти полный контроль над механизмом и может печатать точки в любых точках... Плотность горизонтальной и вертикальной печати составляет восемь точек на мм. В режиме точечной графики печатаемые символы подразделяются на две группы символов - печатаемые битовые комбинации и терминаторы. Разнообразие ограничителей строки определяет способ печати полученных битовых комбинаций.

Графические изображения строятся по одной точечной линии за один проход. Бумага подается через одну пунктирную линию после одной линии печати изображения. Данные для изображения представлены последовательно с шагом 6 бит. Бит 8 зависит от четности; бит 7 всегда равен 1; остальные биты являются битами графического изображения. Для битов графического изображения бит 6 - самый левый бит, а бит 0 - самый правый. Первый отправленный код представляет крайнюю левую позицию каретки, последний символ - крайнюю правую позицию каретки и так далее.

Из-за конфигурации механизма формат данных изображения построен как 384 точки на пунктирную линию. Хост может отправлять максимум 64 кода изображения на одну точку и один код завершения.

ПРИМЕЧАНИЕ. Код изображения не должен быть меньше шестнадцатеричного числа 40; терминатор не должен быть меньше шестнадцатеричного числа 20.

Таким образом, печатные символы определены как P 1 G G G G G G Где P = "Четность, как определено форматом слова", 1= константа 1, а G - графический бит

Символ терминатора определен как P 0 1 0 EXIT X X FEED где P = "Четность, как определено форматом слова", 0 - это константа 0, 1 - это константа 1, "EXIT" позволяет выйти из графического режима (0= не выходить, 1 = выйти), 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.

Другие вопросы по тегам