Delphi POS – 透過USB Printer打開錢櫃

procedure USBOpenCashDrawer(PrinterName: String);
var
  // use winspool
  Handle, hDeviceMode: THandle;
  N: DWORD;
  DocInfo1: TDocInfo1;
  Device, Driver, Port: array [0 .. 255] of char;
  ThePrinter: string;
  code:ansistring;
begin
  ThePrinter := PrinterName;
  Code := chr(27) + chr(64)+ chr(27) + chr(112) + chr(0) + chr(50) + chr(200);

  Printer.PrinterIndex := Printer.Printers.Indexof(ThePrinter);
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  PrinterName := Format('%s', [Device]);
  if not WinSpool.OpenPrinter(PChar(PrinterName), Handle, nil) then
  begin
   // ShowMessage('Error : ' + IntToStr(GetLastError));
    Exit;
  end;
  with DocInfo1 do
  begin
    pDocName := 'Test';
    pOutputFile := nil;
    pDataType := 'RAW';
  end;

  WinSpool.StartDocPrinter(Handle, 1, @DocInfo1);
  WinSpool.StartPagePrinter(Handle);
  WinSpool.WritePrinter(Handle, PAnsiChar(Code), Length(Code), N);
  WinSpool.EndPagePrinter(Handle);
  WinSpool.EndDocPrinter(Handle);
  WinSpool.ClosePrinter(Handle);

end;

[Delphi XE3]ESC/POS範例

找遍了台灣的資料,對於POS收銀系統硬體相關的程式非常的少。

只好自己Try & Error一番,順便也將結果告訴一下大家囉~希望大家不要再為了它而浪費了不少時間。

很簡單的示範如何利用Delphi XE3及SPComm 元件來印出收據、切紙並打開錢櫃。

procedure TForm2.Button1Click(Sender: TObject);
var
  s:Ansistring;
begin
  Comm1.CommName := ComboBox1.Text;
  Try
    Comm1.StartComm;
    //初始化
    s:= chr(27) + chr(64);
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    // 印出目前日期、時間並換行
    s:= DateToStr(now)+' '+TimeToStr(now)+ chr(10)+ chr(13) ;
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    s:= chr(27) + chr(100) + chr(2);
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    s:= chr(29) + chr(33) + chr(17) ;
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    s:= 'Printer - Testing Success'+ chr(10);
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    s:= chr(29) + chr(33) + chr(0) ;
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    s:= chr(27) + chr(100) + chr(5);
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    // 切紙
    s := Chr(29) + Chr(86) + Chr(0) ;
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
    //打開錢櫃
    s := chr(27) + chr(112) + chr(0) + chr(50) + chr(200) ;
    Comm1.WriteCommData(PAnsiChar(s),Length(s));
  Except
    on E: Exception do Begin
      ShowMessage('Open ComPort Error!'+#10#13+'Error MSG:'+E.Message);
    End;
  End;
end;

【認識POS硬體】可程式電子錢櫃Cash drawer

  對一套POS系統來說,收銀結帳是很重要的環節,在早期POS未普遍時,大多由老闆/老闆娘或是可信賴的人來經手金錢,而POS系統普及後,由於可控管結算收銀金額及程式化錢櫃,才讓重要工作可以轉交給收銀員。

錢櫃主要分二種介面接頭(Interface connector),一種是印表機介面(RJ11/RJ12 connector);另一種是RS-232介面。在選購時就要注意,印表機介面的錢櫃是需要連結出單機、發票機或其他印表裝置,因為RJ11/RJ12的接頭接受24V電源輸入,而不用外接電源;而RS-232介面的錢櫃則是直接連結電腦,但RS-232不提供電源,所以需要12V的電源(也有5V的電源)。

控制的部份也分為二種:

1.RS-232介面錢櫃

RS-232介面的錢櫃控制很簡單,只要隨便向RS-232丟訊號即可。

或是在DOS模式(開始→執行 cmd),輸入 copy con com1此類的指令就可以打開了!

2.RJ11/RJ12介面錢櫃

而RJ11/RJ12介面的錢櫃,因為需要先送指令到印表機後,再由印表機發出開錢櫃的指令,相對之下安全性就較高,也可以從印表機的設定中,設定列印前(後)開啟錢櫃。較高階的錢櫃也可以偵測是開啟或關閉的。