EPSON ESCPOS QRCode ›380 символов не печатаются

Я не могу напечатать более 380 символов в qr-коде.

Следует коду на 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

При попытке печати появляется следующее:

печать


person Danilo Loschiavo    schedule 25.09.2015    source источник
comment
Покажите, пожалуйста, как вы используете строку? Насколько я понимаю, вы отправляете его на последовательный порт. Почему бы вам тогда не использовать байтовый массив? Похоже, что ASCII - это ваша проблема, потому что это 7-битная кодировка, но ваша младшая часть длины превышает 7 бит, поэтому вы получаете ? в переменной txt. Вы можете использовать Encoding m_encoding = Encoding.GetEncoding("iso-8859-1"); и установить ту же кодировку для последовательного порта или использовать массив байтов с самого начала. Кстати, вы можете попробовать распечатать QR-код с вашим текущим кодом для текста длиной от 128 до 255?   -  person Ulugbek Umirov    schedule 25.09.2015
comment
Я использую Winspool для печати. Я изменил свой код, чтобы отправить байт в винспул с этой кодировкой, и все работало отлично. Раньше печатал до 380 символов. Теперь все заработало, большое спасибо за помощь!   -  person Danilo Loschiavo    schedule 26.09.2015
comment
Рад, что это помогло, я разместил ответ на случай, если кто-нибудь будет искать ту же проблему.   -  person Ulugbek Umirov    schedule 26.09.2015
comment
Я использовал ваш код для печати qrcode, и он работает безупречно   -  person Nick Chan Abdullah    schedule 06.08.2018


Ответы (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), так как неизвестный символ был закодирован как ?.

Итак, есть 2 решения проблемы. Один из них - использовать кодировку Encoding m_encoding = Encoding.GetEncoding("iso-8859-1"); или любую другую расширенную кодировку ASCII, но она должна быть синхронизирована между кодировкой байтов, которую вы используете в своем коде, и настройками последовательного порта. И еще одно решение — вообще не использовать строки, а использовать байтовые массивы.

person Ulugbek Umirov    schedule 26.09.2015