Это будет напечатано (хотя все еще некрасиво) на ленточном принтере Zebra QL220 из моего приложения CE/CF, работающего на портативном устройстве Motorola MC3100:
public void PrintBarcode(string barcode, string UPC, string description, decimal listPrice)
{
using (SerialPort serialPort = new SerialPort())
{
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One; // other choice is Two (see p. 14-21 in CPCL pdf)
serialPort.PortName = "COM1:";
serialPort.Open();
Thread.Sleep(2500); // I don't know why this is needed, or if it really is...
serialPort.Write("! 0 200 200 210 1\r\n");
serialPort.Write("TEXT 4 0 30 40 Hola el Mundo\r\n"); //Bonjour le Monde --- Hola el Mundo --- Hallo die Welt
serialPort.Write("TEXT 4 0 30 40 \r\n");
serialPort.Write("BARCODE-TEXT 7 0 5\r\n");
serialPort.Write(string.Format("BARCODE 128 1 1 50 150 10 {0}\r\n", barcode));
serialPort.Write("TEXT 4 0 30 40\r\n");
serialPort.Write("FORM\r\n");
serialPort.Write("PRINT\r\n");
serialPort.Close();
}
}
...но все вместе, как полуманиакальные подростки в мошпите - штрих-код, напечатанный последним, на самом деле находится в самой верхней точке бумаги, а "Hola el Mundo" и то, что выглядит как "FOIPM" (как что туда попасть?!?), тоже.
Если "TEXT 4 0 30 40\r\n"
— это не способ отправки CRLF, то что?
ОБНОВИТЬ
Я заметил, что у меня была опечатка в аргументах для печати штрих-кода. Этот:
serialPort.Write(string.Format("BARCODE 128 1 1 50 150 10 {0}\r\n", barcode));
... это должно было быть так:
serialPort.Write(string.Format("BARCODE 128 1 1 50 150 130 {0}\r\n", barcode));
... но когда я "исправил" это (изменил начальную точку по вертикали с 10 до 130), результат печати был идентичен! Простите мой французский, но при чем здесь Северная Дакота?!?
ОБНОВЛЕНИЕ 2
Неважно, как только я добавлю исправление в нужное место, оно действительно сработает (изменив «10» на «130»). Теперь я должен сделать его «умным» в том смысле, что он будет учитывать предыдущие области печати и всегда печатать последующие строки ниже начальной точки + высоты предыдущих распечаток.