2015-09-25 257 views
2

我無法在qr碼中打印超過380個字符。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'變量中得到'?'。你可以使用'Encoding m_encoding = Encoding.GetEncoding(「iso-8859-1」);'爲串口設置相同的編碼,或者從頭開始使用字節數組。順便說一句,你可以嘗試打印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 

串行端口接收(由於失敗的實際數據,以在7編碼158值位ASCII):

1d 28 6b 3f 01 31 50 30 

正如你所看到的,值158 (0x9e)更改爲63 (0x3f),因爲未知的符號被編碼爲?

因此,這個問題有兩種解決方案。一種是使用Encoding m_encoding = Encoding.GetEncoding("iso-8859-1");編碼,或任何其他擴展的ASCII編碼,但它應該在您在代碼中使用的字節編碼和串口設置之間同步。另一個解決方案是根本不使用字符串,而是使用字節數組。