为什么所有内容都打印在同一行,即使我正在添加crlfs?

时间:2013-02-08 23:06:17

标签: c# compact-framework windows-ce zebra-printers opennetcf

这将使用在Motorola MC3100手持设备上运行的CE / CF应用程序在Zebra QL220皮带打印机上打印(尽管仍然很难看):

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的方式,那是什么?

更新

我注意到我在args中输入了打印条形码的拼写错误。这样:

    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”)。现在我必须让它“聪明”,因为它会考虑以前的打印区域,并且始终在先前打印的起点+高度以下打印后续行。

3 个答案:

答案 0 :(得分:3)

看起来就像是在将CPCL直接写入打印机。您正在使用的TEXT命令在命令中包含x和y坐标 - 即,您正在编写的'30'和'40'告诉打印机始终在坐标30,40处打印每行文本。尝试使用要打印的每个后续文本行更改这些坐标。据我所知,CPCL没有“自动换行”功能,因此您必须为每行文本手动执行此操作。

或者,您可以将打印机置于行式打印模式。在此模式下,打印机将只打印它收到的任何文本,'\ r \ n'将使打印机开始在下一行打印。您可以通过向打印机发送以下命令来切换行打印模式:

! U1 setvar“device.languages”“line_print”[新行字符]

来源:CPCL手册 - http://www.zebra.com/content/dam/zebra/manuals/en-us/printer/cpcl-pm-en.pdf

答案 1 :(得分:1)

作为一般规则,请考虑使用System.Environment.Newline

但是,在这种情况下,您可能需要检查设备(Zebra QL220)对换行符的期望/要求。

答案 2 :(得分:1)

我不知道怎么写Zebra打印机,但是:

我看到“文本开头”(TEXT 4 0 30 40)和“条形码开始”(BARCODE 128 1 1)的代码。

是否应该有“文本结束”或“条形码结束”的代码?

“下一行”的代码怎么样?