【问题标题】:ASCII raw symbols to control a printer from a .txt file从 .txt 文件控制打印机的 ASCII 原始符号
【发布时间】:2010-01-31 18:14:33
【问题描述】:

通过发送一串原始 ASCII 字符(格式化标签)来控制标签打印机。像这样:

 string s = "\x02L\r" + "D11\r" + "ySWR\r" + "421100001100096" + date + "\r" + "421100002150096" + time + "\r" + "421100001200160" + price + "\r" + "E\r";

 RawPrinterHelper.SendStringToPrinter(printerName, s);

这种硬编码的变体效果很好。

现在我想将控制字符串放入一个 .txt 文件并在运行时读取它。像这样:

        string printstr;
        TextReader tr = new StreamReader("print.txt");
        printstr = tr.ReadLine();
        tr.Close();

但在这种情况下,打印机什么也不打印。

似乎StreamReader 在这个字符串中添加了其他内容

(如果我将读取的字符串放入MessageBox.Show(printstr);,一切看起来都不错。但是,这样我们就看不到添加的控制字符)。

有什么办法可以解决这个问题?

【问题讨论】:

  • 您所说的“但在这种情况下打印机什么也不打印”是什么意思?你是说打印字符串的内容吗?
  • 没有。打印机根本不打印。如果控制字符串的格式有错误,它的行为就像这样,所以我假设 StreamReader 添加了一些不可见的字符。此打印机不打印字符串的内容,而仅打印(在上面的示例中)日期、时间和价格。其余的只是符号,格式化标签。
  • 在下面查看我编辑的答案:)
  • 您的问题帮助我弄清楚如何将打印作业发送到我的 Datamax 标签打印机
  • @seabass2020 很高兴它有帮助!是的,就我而言,它是一台 Datamax 打印机。

标签: c# string text printing zebra-printers


【解决方案1】:

您的代码调用了一次tr.ReadLine(),但看起来该字符串中有多行。

【讨论】:

    【解决方案2】:

    看起来像 Zebra 标签打印机,我很不高兴。您需要修复的第一件事是生成 print.txt 文件的方式。您需要为以 \r 结尾的命令字符串的每一部分写一行。例如,你的命令字符串应该这样写:

    printFile.WriteLine("\x02L");
    printFile.WriteLine("D11");
    printFile.WriteLine("ySWR");
    printFile.WriteLine("421100001100096" + date);
    printFile.WriteLine("421100002150096" + time);
    printFile.WriteLine("421100001200160" + price);
    printFile.WriteLine("E");
    printFile.WriteLine();
    

    现在您可以在从 print.txt 读取标签时使用 ReadLine()。您需要阅读多行才能获得完整的标签。我在最后添加了一个空行,您可以在读取文件时使用它来检测您是否获得了创建标签的所有行。发送到打印机时不要忘记再次附加“\r”。

    【讨论】:

    • @nobugz 谢谢!你的意思是,我不应该通过简单的手动输入来编辑这个 .txt 文件吗?问题的原因是手动编辑此文件吗?
    • 呃,很可能。通常很难使用文本编辑器将 \x02 控制代码填充到文件中。我不知道如何使用记事本或 Visual Studio 的编辑器来做到这一点。不,键入“\x02”不会这样做。
    【解决方案3】:

    可能是 StreamReader 正在以 Unicode 格式读取它。顺便说一句,您只阅读了一行...您需要迭代这些行...您最好的办法是这样做:

    字符串打印字符串; TextReader tr = new StreamReader("print.txt",System.Text.Encoding.ASCII); printstr = tr.ReadToEnd(); tr.Close();

    或者将其读取为二进制文件,然后将整个块读取为一系列字节,省略错误检查。

    System.IO.BinaryReader br = new System.IO.BinaryReader(new StreamReader("print.txt", System.Text.Encoding.ASCII)); 字节[] 数据 = br.ReadBytes(br.BaseStream.Length); br.关闭();

    编辑:rem 的评论之后,我认为最好在此处包含这个额外的 sn-p...这是从上一个 sn-p 开始的,其中变量 data 是引用...

    字符串 sData = System.Text.Encoding.ASCII.GetString(data);

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 谢谢,汤姆!如果以二进制文件的形式读取,在发送到打印机之前,如何将“byte[] data”转回字符串?
    • 关于 StreamReader 只读取一行(你认为这是由于“\r”符号造成的吗?),我只需要注意,在读取到 MessageBox 后显示字符串时,它看起来是整个字符串放到一个 .txt 文件中,没有任何遗漏。
    • @rem:请查看答案的编辑部分... :) 至于'\r',标准的行尾是'\r\n',最好使用System.Environment.Newline 代替硬编码版本,使其更加健壮和平台可移植。
    • 通过使用 ASCII 包装 StreamReader 的 BinaryReader 读取字节是一个坏主意。如果您想读取 二进制 数据,只需使用 Stream - 根本不要使用 StreamReader。
    • @Jon: 哦......很好发现......天哪......我影响不好,现在 rem 可能已经将我的代码加入并使用它......
    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多