Delphi寫餐飲硬體標準ESC/POS與醫療檢驗儀器連線ASTM通訊有感

下午到舊公司討論電子發票格式相關問題,跟舊同事聊天聊到電子發票支援的硬體時,舊同事也抱怨到POS相關的硬體廠商雖然”宣稱”支援”標準的ESC/POS指令”,但實測起來每台機器還是會呈現出不同的結果。

突然想到之前在做醫療檢驗儀器連線時,即使設備商提到是使用ASTM格式傳輸,但不管是尿液、血液…..適用什麼immuLite、AXSYM、Alastat….最後在做連線通訊時也是不一樣。

這也是做軟硬體結合時,寫程式的悲哀吧XDDD不過寫出來時又是另一種雀躍的心情了~~

[Delphi XE3]ESC/POS範例

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

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

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

[sourcecode language=”delphi”]
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;
[/sourcecode]

【POS系統開發】淺談ESC/POS

ESC/POS是由EPSON所制定給POS印表機專用的控制碼,因為清楚的制定各機型間的專有功能,且具有高度彈性的特性。後來被廣泛的支援並應用!目前大部份的熱感應印表機(出單機、發票機),都支援ESC/POS這套控制碼。所以POS在開發時,印表機可以在不用安裝驅動程式的狀況下,直接以ESC/POS指令列印。

而從下圖可以看到ESC/POS則是由ESC/P (Epson Standard Code for Printers)所衍生下來的。
esc-pos-history
如果對於指令有興趣的朋友,可以參考以下的文件。

常用ASCII CHR碼對照

因為開發需求,把對照表留下來一下。

Chr(0)NullChr(29)分组符Chr(38)&Chr(48)0
Chr(8)退格Chr(30)記錄分離符號Chr(39)Chr(49)1
Chr(9)TabChr(31)單元分隔符號Chr(40)(Chr(50)2
Chr(10)换行Chr(32)空格SPACEChr(41))Chr(51)3
Chr(12)换页Chr(33)!Chr(42)*Chr(52)4
Chr(13)EnterChr(33)!Chr(43)+Chr(53)5
Chr(22)粘贴Chr(34)Chr(44),Chr(54)6
Chr(26)撤销Chr(35)#Chr(45)Chr(55)7
Chr(27)EscChr(36)$Chr(46).Chr(56)8
Chr(28)文件分隔符Chr(37)%Chr(47)/Chr(57)9
Chr(58):Chr(68)DChr(78)NChr(88)X
Chr(59);Chr(69)EChr(79)OChr(89)Y
Chr(60)<Chr(70)FChr(80)PChr(90)Z
Chr(61)=Chr(71)GChr(81)QChr(91)[
Chr(62)>Chr(72)HChr(82)RChr(92)\
Chr(63)?Chr(73)IChr(83)SChr(93)]
Chr(64)@Chr(74)JChr(84)TChr(94)^
Chr(65)AChr(75)KChr(85)UChr(95)_
Chr(66)BChr(76)LChr(86)VChr(96)`
Chr(67)CChr(77)MChr(87)WChr(97)a
Chr(98)bChr(108)lChr(118)vChr(128)
Chr(99)cChr(109)mChr(119)w
Chr(100)dChr(110)nChr(120)x
Chr(101)eChr(111)oChr(121)y
Chr(102)fChr(112)pChr(122)z
Chr(103)gChr(113)qChr(123){
Chr(104)hChr(114)rChr(124)|
Chr(105)iChr(115)sChr(125)}
Chr(106)jChr(116)tChr(126)~
Chr(107)kChr(117)uChr(127)删除