Почему я должен вызывать команду инициализации дважды? (иначе я получаю вывод "t @") - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть принтер Epson TM-T88VI, и я использую Microsoft.PointOfService.PosPrinter в C# для печати. ​​

У меня есть две следующие тестовые функции:

    public static void printerTestFunction(string printerName)
    {
        PosExplorer explorer = new PosExplorer();
        DeviceInfo di = explorer.GetDevice("PosPrinter", printerName);
        PosPrinter printer = (PosPrinter)explorer.CreateInstance(di);

        printer.Open();
        printer.Claim(10000);
        printer.DeviceEnabled = true;
        printer.AsyncMode = false;

        string init = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 64 });
        string totalCut = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 105 });
        string cmd = init + "A€A\nB€B\n\n\n\n\n\n\n\n" + totalCut;
        printer.PrintNormal(PrinterStation.Receipt, cmd);
    }

    public static void printerTestFunction2(string printerName)
    {
        PosExplorer explorer = new PosExplorer();
        DeviceInfo di = explorer.GetDevice("PosPrinter", printerName);
        PosPrinter printer = (PosPrinter)explorer.CreateInstance(di);

        printer.Open();
        printer.Claim(10000);
        printer.DeviceEnabled = true;
        printer.AsyncMode = false;

        string init = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 64 });
        string totalCut = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 105 });
        string cmd = init + init + "A€A\nB€B\n\n\n\n\n\n\n\n" + totalCut;
        printer.PrintNormal(PrinterStation.Receipt, cmd);
    }

единственное различие между двумя функциями: в функции 2 я посылаю «двойной» init на принтер (см. string cmd = инициализация). Обычно я ожидаю, что две функции приведут к одному и тому же результату. Но это не так.

После вызова «printerTestFunction2» я получаю вывод, как и ожидалось:

A € A

B € B

correct output

Когда я перезапускаю свою программу и вызываю «printerTestFunction», я получаю следующий вывод:

t@A € A

B € B

wrong output

Я также тестировал другие функции. Первая команда инициализации всегда печатается как «t @», за исключением случаев, когда я запускаю принтер дважды.

Может кто-нибудь объяснить такое поведение?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Это потому, что, как я ответил на предыдущий вопрос, приложение отправляет команду инициализации напрямую.
Почему символ «€» печатается только до инициализации принтера, а не после инициализации?

Если вы используете POS для. NET (включая OPOS / JavaPOS), вам не следует использовать команду инициализации (ESC @) или аналогичные команды для изменения режима или настроек.

Если вы хотите что-то сделать, вызовите метод или поместите escape-последовательность POSPrinter, определенную в UnifiedPOS, в строку запроса на печать.

0 голосов
/ 08 апреля 2020

Я думаю, это может быть причиной, потому что вы не добавили "Es c @" в конце команды. В примере Page335 указывается, что каждая программа имеет «Начальное задание», а «Конечное задание» совпадает с кодом «Es c @» (то же самое, что и новый »байт [] {27, 64 } ")

Но похоже, что вы не добавили это в конец команды, поэтому, если в следующий раз вы введете команду« Es c @ », на самом деле это последняя программа« Конец задания »в последний раз. «? Я думаю, это может быть причиной того, что перед выводом есть что-то вроде «t @»?

Так что вы можете попробовать что-то изменить, например:

string cmd = init + "A€A\nB€B\n\n\n\n\n\n\n\n" + totalCut + init;

Если это так, это может привести к успеху на второй раз.

...