2015-06-05 204 views
1

我正嘗試在熱敏打印機上發送ESC/POS命令。但是,每當我發送熱敏打印機打印它們作爲文本,而不是執行它們作爲命令。我正在將這些命令寫入.prn文件,並且每當我執行lp命令來打印文件時,這些.prn文件也會被打印出來,但是作爲文本。如何將ESC/POS命令發送到Linux中的熱敏打印機

我嘗試以下方法在.PRN文件中寫入ESC/POS命令:

1) PRINT #1, CHR$(&H1D);"h";CHR$(80); 
    PRINT #1, CHR$(&H1D);"k";CHR$(2); 
    PRINT #1, "48508007";CHR$(0); 
    PRINT #1, CHR$(&HA); 
    PRINT #1, CHR$(&H1D);"k";CHR$(67);CHR$(12); 
    PRINT #1, "48508007"; 

2) <ESC>(0x1B) <L>(0x4C) 
    <GS>(0x1D) <k>(0x6B) 73 2 4 5 6 7 8 9 NUL 
    <FF>(0x0c) 

3) <ESC L> 
    <GS k 73 2 4 5 6 7 8 9 NUL> 

4) 「ESC L」 「GSķ73 2 4 5 6 7 8 9 NUL」 「FF」 我也嘗試用C程序作爲發送ESC/POS命令:

#include<stdio.h> 
#include<stdlib.h> 
#include<fcntl.h> 

int main() { 
    int fd,ret; 
    char buf[] = "HELLO" 

    fd = open("/dev/bus/usb/003/007",O_WRONLY); 
    if(fd < 3) { 
     perror(open failed); 
    } 

    ret = write(fd,&buf,sizeof(buf)); 
    if(ret == -1) { 
     perror("write failed"); 
    } 
} 

在執行上面的代碼給出誤差爲:

write failed: invalid arguments 

回答

0

如果您確信十六進制代碼,您可以使用您最喜歡的十六進制編輯器來創建一個正確的命令prn文件。 或者你可以從這裏選擇一個:Need a good hex editor for Linux
爲什麼十六進制編輯器?因爲所有其他方式,包括一些隱藏內容(如新行0x0d),並且打印機無法理解命令的順序。程序中可能存在的其他問題是用於傳送命令的程序 - 某些程序有時會在將其發送到打印機時添加其他內容或進行一些對話(如多出一頁)。請確保 - 您的程序無法做到這一點。
我的問題解決方式這一次:

  • 可以肯定的,逃逸sequencies是正確的。 (某些打印機使用特殊的轉義序列,以標記 - 下一個比特流將是命令,而不是數據)
  • 請確保您要發送到打印機的文件是正確的(文件中沒有其他代碼 - 簡單方法檢查是mc查看器 - 十六進制模式視圖(F4))
  • 可以肯定,傳送到打印機是bitvise正確的 - 交付程序不操縱命令文件(使用man來檢查它) - 像轉換非打印字符十六進制代碼
+0

謝謝@abartek您的​​迴應。我嘗試過沒有成功。 – user3860949

+0

我使用lp命令將該文件發送到打印機,該命令用於打印文件。這是向打印機發送命令的正確方式,或者有任何其他方法來執行此操作。此熱敏打印機使用USB端口連接到系統。 – user3860949

+0

在C語言中是否有任何庫支持來執行此操作。 – user3860949

0

如果熱敏打印機通過USB連接,CUPS很有可能聲稱該端口。因此,您將無法以普通用戶身份向其發送數據。

要通過杯子發送原始字節,請使用lpr -l filelp -o raw file。要檢查要發送的字節,請使用十六進制查看器xxd。這些打印機通常在生產線末端使用CRLF,因此請務必發送\r\n

我沒有一個C庫給你,但我已經成功與python-escpos

2

這裏包括兩個問題:數據傳輸,並且正在傳輸的數據。

數據傳輸:使用usblp

用於獲取數據到打印機,檢查usblp被加載。它允許您將打印機作爲lp組中的文件公開,以便您可以將其打開爲/dev/usb/lp0

一旦這個工作,作爲一個普通用戶,你可以這樣寫:

echo "Hello" > /dev/usb/lp0

我寫了blog post on the topic覆蓋這個權限的一面。

數據格式

其次,數據本身需要以正確的二進制格式發送。打印機將無法直接理解此可讀的.prn(打印?)文件,因此需要將其轉換爲正確的二進制格式。

爲了從你的問題解釋的幾件事情:

  • ESC意味着\x1b,一個ASCII逃脫
  • k手段``,實際ASCII字母k
  • ​​意味着\x50,這是怎麼號碼80被髮送到打印機。
  • CHR$(&H1D);裝置\x1d,一個ASCII組分離器(GS

可以直接在CLI使用echo -e寫一些基本命令。也許最簡單的非文本示例是一個代表'000'的CODE39條形碼。

在人類可讀的形式,那麼十六進制此相同的命令,然後作爲一個終端命令將是:

  • GS k 4 0 0 0 NUL
  • 1d 6b 04 30 30 30 00
  • echo -e '\x1d\x6b\x04000\x00' > /dev/usb/lp0

你的這一最佳參考格式是您打印機的編程手冊,但希望這可以幫助您解讀它。

請注意您嘗試執行的命令包含錯誤,其中一個甚至會將您陷入頁面模式。

另外,@scruss和@abartek的答案是完全正確的:檢查CUPS是否使用lsusb命令聲明瞭端口,並使用十六進制編輯器來檢查輸出,或者使用庫來生成已知 - 好的命令。

相關問題