2015-09-25 3 views
2

Я не могу напечатать более 380 символов в qr-коде.EPSON ESCPOS QRCode> 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 

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

print

+1

Показать, пожалуйста, как вы используете строку? Насколько я понимаю, вы отправляете его в последовательный порт. Почему бы вам не использовать байтовый массив? Похоже, что ASCII - это ваша проблема, потому что это 7-битная кодировка, но ваша низкая часть длины превышает 7 бит, поэтому вы получаете '?' В переменной 'txt'. Вы можете использовать «Кодирование m_encoding = Encoding.GetEncoding (« iso-8859-1 »);» и установить одинаковое кодирование для последовательного порта или использовать массив байтов с самого начала. BTW, можете ли вы попытаться напечатать QR-код с вашим текущим кодом для текста длиной от 128 до 255? –

+0

Я использую Winspool для печати. Я изменил свой код, чтобы отправить байт в winspool с этой кодировкой и отлично работал. Перед печатью до 380 символов. Теперь это сработало, спасибо вам большое за вашу помощь! –

+1

Рад, что это помогло, я отправил ответ в случае, если кто-то будет искать ту же проблему. –

ответ

3

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, но она должна быть синхронизирована между кодировкой байтов, которую вы используете в своем коде и настройками последовательного порта. И еще одно решение - не использовать строки вообще, а использовать массивы байтов.