Медленная печать на термопринтере VKP 80
От: serber  
Дата: 21.11.12 07:55
Оценка:
Принтер подключен по USB. На принтер отправляются esc/pos команды. Проблема в следующем: изображение печатается очень долго, в среднем уходит 10-15 секунд от начала печати. Для наглядности записал весь процесс на видео: ссылка на видео

Реализация печати:


public void PrintRasterBitImage(Bitmap image)
{
    var rw = image.Width;
    var rh = image.Height;

    var w = (byte)(((rw / 8) + 1) * 8);
    var h = (byte)(((rh / 8) + 1) * 8);

    if (rw == w - 8)
    {
        w = (byte)rw;
    }

    if (rh == h - 8)
    {
        h = (byte)rh;
    }

    byte[] cmd1 = { 0x1D, (byte)'*', (byte)(w / 8), (byte)(h / 8) };
    Write(cmd1);

    int x = 0, y = 0;
    byte b = 0;
    for (var p = 0; p < w * h;)
    {
        byte bc;
        for (bc = 0; bc < 8; bc++)
        {
            if (p < rw * rh)
            {

                var color = image.GetPixel(x, y);
                var luma = (int)((color.R * 0.3) + (color.G * 0.59) + (color.B * 0.11));
                if (luma > 127)
                {
                    b |= (byte)(1 << (7 - bc));
                }
            }

            y++;

            if (y >= rh)
            {
                x++;
                bc += (byte)(h - rh);
                y = 0;
            }

            p++;
        }

        Write(b);
        b = 0;
    }

    byte[] cmd2 = { 0x1D, (byte)'/', 3 };
    Write(cmd2);
}


Метод Write пишет в BinaryWriter

Может кто-то сталкивался со схожей проблемой или знает в чем может быть проблема?
Re: Медленная печать на термопринтере VKP 80
От: HowardLovekraft  
Дата: 21.11.12 09:31
Оценка:
Здравствуйте, serber, Вы писали:

S>Метод Write пишет в BinaryWriter

М.б., вызывать Flush принудительно после каждой записи?
Re[2]: Медленная печать на термопринтере VKP 80
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.11.12 10:15
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, serber, Вы писали:


S>>Метод Write пишет в BinaryWriter

HL>М.б., вызывать Flush принудительно после каждой записи?

Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.
Re[3]: Медленная печать на термопринтере VKP 80
От: WolfHound  
Дата: 21.11.12 10:57
Оценка:
Здравствуйте, samius, Вы писали:

S>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.

Скорей всего так и надо делать.
А вообще код страшный.
Что там происходит понять трудно.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Медленная печать на термопринтере VKP 80
От: Ромашка Украина  
Дата: 21.11.12 11:09
Оценка:
Здравствуйте, serber, Вы писали:
S>Может кто-то сталкивался со схожей проблемой или знает в чем может быть проблема?

В печати рисунка? На кой вам вообще рисунок? Что за рисунок???

ЗЫ. Попробуй поднять скорость по RS-232 (да, я прочитал про подключение по USB)


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: Медленная печать на термопринтере VKP 80
От: serber  
Дата: 21.11.12 11:19
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Здравствуйте, serber, Вы писали:

S>>Может кто-то сталкивался со схожей проблемой или знает в чем может быть проблема?

Р>В печати рисунка? На кой вам вообще рисунок? Что за рисунок???


Генерируется квитанция, ее и нужно распечатать.
Re[3]: Медленная печать на термопринтере VKP 80
От: serber  
Дата: 21.11.12 11:20
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, HowardLovekraft, Вы писали:


HL>>Здравствуйте, serber, Вы писали:


S>>>Метод Write пишет в BinaryWriter

HL>>М.б., вызывать Flush принудительно после каждой записи?

S>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.


Flush вызывается после вызова метода печати изображения
Re[4]: Медленная печать на термопринтере VKP 80
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.11.12 11:22
Оценка:
Здравствуйте, serber, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.


S>Flush вызывается после вызова метода печати изображения


Ну и что? Есть какая-то гарантия что данные в устройства не идут побайтово в момент вызова Write(b)?
Re[4]: Медленная печать на термопринтере VKP 80
От: andrey82  
Дата: 21.11.12 11:30
Оценка:
Здравствуйте, serber, Вы писали:

S>>>>Метод Write пишет в BinaryWriter

HL>>>М.б., вызывать Flush принудительно после каждой записи?

S>>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.


S>Flush вызывается после вызова метода печати изображения


Рекомендую разбить код минимум на 2 функции:
1) Формирование байтового массива команд для принтера (незнаком с этим протоколом, просто смотрел по коду)
Сразу замерить время выполнения, т.к. есть сомнения в производительности GetPixel(), да и размер картинки неизвестен.
2) Отправка на принтер. Тут надо посмотреть размер массива, и сразу прикинуть, сколько времени займет его передача через интерфейс (скорее всего используется виртуальный COM порт с эмуляцией битрейта).

Ну и напоследок: есть какое-то стороннее ПО (может пример из SDK или что-нибудь еще...), которое печатает с приемлемой скоростью?
Re[5]: Медленная печать на термопринтере VKP 80
От: serber  
Дата: 21.11.12 11:33
Оценка:
Здравствуйте, andrey82, Вы писали:

A>Ну и напоследок: есть какое-то стороннее ПО (может пример из SDK или что-нибудь еще...), которое печатает с приемлемой скоростью?


Есть готовая реализация OPOS драйвера, но он печатает еще медленнее.
Re[3]: Медленная печать на термопринтере VKP 80
От: Ромашка Украина  
Дата: 21.11.12 12:09
Оценка:
Здравствуйте, serber, Вы писали:
S>Генерируется квитанция, ее и нужно распечатать.

Ну, где-то так оно и будет печатать. Если хочешь быстрее -- печатай квитанцию текстом.


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[4]: Медленная печать на термопринтере VKP 80
От: serber  
Дата: 21.11.12 12:23
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Здравствуйте, serber, Вы писали:

S>>Генерируется квитанция, ее и нужно распечатать.

Р>Ну, где-то так оно и будет печатать. Если хочешь быстрее -- печатай квитанцию текстом.


Конечно, а чтобы распечатать логотип, можно и ascii art вопользоваться
Re[3]: Медленная печать на термопринтере VKP 80
От: HowardLovekraft  
Дата: 21.11.12 12:31
Оценка:
Здравствуйте, samius, Вы писали:

S>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером.

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

Опыт работы с фекальными регистраторами и чековыми принтерами есть и довольно большой.

ТС, яркость печати какая выставлена? Уменьшить пробовал?
Re[5]: Медленная печать на термопринтере VKP 80
От: Ромашка Украина  
Дата: 21.11.12 14:33
Оценка:
Здравствуйте, serber, Вы писали:
S>Конечно, а чтобы распечатать логотип, можно и ascii art вопользоваться

А логотипы там в отдельную память принтера заливаются. И печатаются вполне себе ESC/POS командами.


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[6]: Медленная печать на термопринтере VKP 80
От: serber  
Дата: 22.11.12 09:32
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Здравствуйте, serber, Вы писали:

S>>Конечно, а чтобы распечатать логотип, можно и ascii art вопользоваться

Р>А логотипы там в отдельную память принтера заливаются. И печатаются вполне себе ESC/POS командами.


Помимо логотипов есть, например, вертикальны/горизонтальные линии, и иные элементы которые в виде текста не представишь. Раз уж стоит задача печатать изображение, что я считаю вполне нормальным, значит на это есть причины. Если была бы возможность ограничится текстом, так бы и сделал
Re[7]: Медленная печать на термопринтере VKP 80
От: Ромашка Украина  
Дата: 22.11.12 13:37
Оценка: +1
Здравствуйте, serber, Вы писали:
S>Помимо логотипов есть, например, вертикальны/горизонтальные линии, и иные элементы которые в виде текста не представишь. Раз уж стоит задача печатать изображение, что я считаю вполне нормальным, значит на это есть причины. Если была бы возможность ограничится текстом, так бы и сделал

А если бы стояла задача печатать фотографии, ты бы на РСДН задавал вопросы как печатать на VKP80 фотографии??? Serber, эта железяка не предназначена для печати графики. Смирись с тормозами или печатай текстом.


Всё, что нас не убивает, ещё горько об этом пожалеет.