Почему символ € печатается только до инициализации принтера, а не после инициализации?

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

Используя следующую функцию, я получаю странный вывод:

    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" + init + "C€C\nD€D\n\n\n\n\n\n\n" + totalCut;
        printer.PrintNormal(PrinterStation.Receipt, cmd);
    }

Результат:

A€A

B€B

ХФУ

ДФД

введите здесь описание изображения

Таким образом, символ € печатается как странный символ «F» (кажется, что F ниже, чем обычные символы). Бумага обрезана правильно.

Я также тестировал различные созвездия. Кажется, что знак «€» печатается только перед первой командой инициализации, которая отправляется на принтер после того, как хотя бы одна строка была распечатана. (Я могу отправить несколько команд инициализации в начале - печатается €. Если я отправлю инициализацию после того, как были напечатаны некоторые символы, вместо «€» появится «F». Если я перезапущу свою программу, «€» снова будет напечатан правильно, но если я отправлю команду инициализации, она снова будет напечатана как «F».

По какой причине символ «€» печатается только перед третьей командой инициализации? Что-то не так с моим кодом или я пропустил настройку?


person Boardwish    schedule 08.04.2020    source источник


Ответы (1)


Причина, по которой печатаются такие буквы, как F, заключается в том, что принтер находится в инициализированном состоянии, кодовая страница 437.
Посмотрите на буквы в следующем материале: 213 в десятичном формате и 0xD5 в шестнадцатеричном.

Страница 0 [PC437: США, стандартная Европа]

Страница 19 [PC858: Евро]


Объект службы POS for.NET внутренне управляет настройками кодовой страницы в соответствии со значением свойства CharacterSet.

Если приложение произвольно отправляет команды инициализации на принтер, информация управления служебным объектом может быть несовместимой, и принтер может печатать неправильно.

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

В этом смысле, вместо отправки выреза бумаги также непосредственно командой ESC i({ 27, 105 }), вызовите метод CutPaper или поместите управляющую последовательность выреза бумаги POSPrinter (ESC|P), определенную в UnifiedPOS, в строку запроса на печать.

person kunif    schedule 08.04.2020
comment
Спасибо за быстрый ответ, это имеет смысл ... я не знал, что инициализация выполняется автоматически. Я предположил, что принтер вернется в состояние, в котором он был до того, как я вручную отправил какие-либо команды на принтер. - person Boardwish; 08.04.2020