【问题标题】:EPSON ESCPOS QRCode >380 characters not printEPSON ESCPOS QRCode >380 个字符不打印
【发布时间】:2015-12-23 14:41:54
【问题描述】:

我无法在二维码中打印超过 380 个字符。

遵循 C# 中的代码:

    protected ASCIIEncoding m_encoding = new ASCIIEncoding();
string QRdata = @"35150909165024000175590000193130072726117830|20150924062259|50.00||hdMEPiER6rjZKyKA+4+voi1nncxsAGFbYsEEqnh04SbvUEI/haUF4GUBPxT6Q2Uhf9f8QYgxiwxWo3GxRrvj4WnNeTYgAqUAYmOANPItNkOw0CppmZ4R8i1ZOlnftVhksCM0zrl4RiKgoazbN44hUu2nQf0W/JLvFXzXu12JlcSThNtmyJ6m9WBsMc/sf9BE14HDoXMyKRIQYt5TkEjilHH9Ffa0saRyUIp+Fji89/Moq8YCCFC+qC44XGxsvNCeeHUNOc1LgPP0DbU1miwpVnrBlEl87RU8Iy0r8fN/fNhbcStkwfTEvhYvZz42nEKHrmGTpGZYkHuTFCNZPq7aCA==";
        int store_len = QRdata.Length + 3;
                        byte store_pL = (byte)(store_len % 256);
                        byte store_pH = (byte)(store_len / 256);


                         string txt = m_encoding.GetString(new byte[] { 29, 40, 107, store_pL, store_pH, 49, 80, 48 }); //FUNCTION 180
            txt += QRdata;
            txt += m_encoding.GetString(new byte[] { 29, 40, 107, 3, 0, 49, 69, 48 });//FUNCTION 169
            txt += m_encoding.GetString(new byte[] { 29, 40, 107, 3, 0, 49, 67, 5 });//FUNCTION 167
            txt += m_encoding.GetString(new byte[] { 29, 40, 107, 4, 0, 49, 65, 50, 0 });//FUNCTION 165
            txt += m_encoding.GetString(new byte[] { 29, 40, 107, 3, 0, 49, 81, 48 });//FUNCTION 181

尝试打印时出现如下:

【问题讨论】:

  • 请显示,你如何使用字符串?据我了解,您将其发送到串行端口。那你为什么不使用字节数组呢?看起来 ASCII 是你的问题,因为它是 7 位编码,但是你的长度的低部分超过了 7 位,所以你在txt 变量中得到?。您可以使用Encoding m_encoding = Encoding.GetEncoding("iso-8859-1"); 并为串口设置相同的编码,或者从头开始使用字节数组。顺便说一句,您可以尝试使用当前代码打印 QR 码以获取长度在 128 到 255 之间的文本吗?
  • 我正在使用 Winspool 进行打印。我更改了代码以使用此编码将字节发送到winspool,并且运行良好。打印前最多 380 个字符。现在成功了,非常感谢您的帮助!
  • 很高兴它有帮助,我发布了一个答案,以防有人会寻找同样的问题。
  • 我用你的代码打印了二维码,效果很好

标签: c# qr-code epson escpos


【解决方案1】:

ASCII 是个问题,因为它是 7 位编码,但 store_PL 的值大于 127(占用 8 位)。以下是正在发生的事情的演示:

ASCIIEncoding m_encoding = new ASCIIEncoding();
string QRdata = @"35150909165024000175590000193130072726117830|20150924062259|50.00||hdMEPiER6rjZKyKA+4+voi1nncxsAGFbYsEEqnh04SbvUEI/haUF4GUBPxT6Q2Uhf9f8QYgxiwxWo3GxRrvj4WnNeTYgAqUAYmOANPItNkOw0CppmZ4R8i1ZOlnftVhksCM0zrl4RiKgoazbN44hUu2nQf0W/JLvFXzXu12JlcSThNtmyJ6m9WBsMc/sf9BE14HDoXMyKRIQYt5TkEjilHH9Ffa0saRyUIp+Fji89/Moq8YCCFC+qC44XGxsvNCeeHUNOc1LgPP0DbU1miwpVnrBlEl87RU8Iy0r8fN/fNhbcStkwfTEvhYvZz42nEKHrmGTpGZYkHuTFCNZPq7aCA==";
int store_len = QRdata.Length + 3; // 414
byte store_pL = (byte)(store_len % 256); // 158
byte store_pH = (byte)(store_len / 256); // 1
byte[] data = new byte[] { 29, 40, 107, store_pL, store_pH, 49, 80, 48 }; //FUNCTION 180
string txt = m_encoding.GetString(data);
byte[] invalidData = m_encoding.GetBytes(txt);

数据的原始值(预期值):

1d 28 6b 9e 01 31 50 30

串口接收的实际数据(由于无法将158值编码为7位ASCII):

1d 28 6b 3f 01 31 50 30

如您所见,值158 (0x9e) 更改为63 (0x3f),因为未知符号被编码为?

所以,这个问题有两种解决方案。一种是使用Encoding m_encoding = Encoding.GetEncoding("iso-8859-1"); 编码,或任何其他扩展的ASCII 编码,但它应该在您在代码中使用的字节编码和串口设置之间同步。而另一种解决方案是根本不使用字符串,而是使用字节数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2016-12-01
    • 2012-11-21
    相关资源
    最近更新 更多