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) Null Chr(29) 分组符 Chr(38) & Chr(48) 0
Chr(8) 退格 Chr(30) 記錄分離符號 Chr(39) Chr(49) 1
Chr(9) Tab Chr(31) 單元分隔符號 Chr(40) ( Chr(50) 2
Chr(10) 换行 Chr(32) 空格SPACE Chr(41) ) Chr(51) 3
Chr(12) 换页 Chr(33) ! Chr(42) * Chr(52) 4
Chr(13) Enter Chr(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) Esc Chr(36) $ Chr(46) . Chr(56) 8
Chr(28) 文件分隔符 Chr(37) % Chr(47) / Chr(57) 9
Chr(58) : Chr(68) D Chr(78) N Chr(88) X
Chr(59) ; Chr(69) E Chr(79) O Chr(89) Y
Chr(60) < Chr(70) F Chr(80) P Chr(90) Z
Chr(61) = Chr(71) G Chr(81) Q Chr(91) [
Chr(62) > Chr(72) H Chr(82) R Chr(92) \
Chr(63) ? Chr(73) I Chr(83) S Chr(93) ]
Chr(64) @ Chr(74) J Chr(84) T Chr(94) ^
Chr(65) A Chr(75) K Chr(85) U Chr(95) _
Chr(66) B Chr(76) L Chr(86) V Chr(96) `
Chr(67) C Chr(77) M Chr(87) W Chr(97) a
Chr(98) b Chr(108) l Chr(118) v Chr(128)
Chr(99) c Chr(109) m Chr(119) w
Chr(100) d Chr(110) n Chr(120) x
Chr(101) e Chr(111) o Chr(121) y
Chr(102) f Chr(112) p Chr(122) z
Chr(103) g Chr(113) q Chr(123) {
Chr(104) h Chr(114) r Chr(124) |
Chr(105) i Chr(115) s Chr(125) }
Chr(106) j Chr(116) t Chr(126) ~
Chr(107) k Chr(117) u Chr(127) 删除