Pages

2012-10-29

透過RJ-11埠開啟電子錢箱

POS主機通常會有一個RJ-11埠連接電子錢箱(DC 12V),要以GPIO讀寫來控制它,就得知道它的GPIO暫存器位址。通常主機廠商能提供規格文件,例如以下的畫面(這算是寫得很人性的文件,有些寫得十分不直覺):
CashDrawer Register Spec 
上圖是說只要寫IO位址0A22h,將該Byte的Bit4設為1即可開錢箱。我們可以透過RW工具開啟IO Space位址圖,並寫值測試是否可開?你可以使用LPT1的位址區段(0378h)作此工具實驗,這些區段通常允許你寫入值。
LPT1 IO Range

RJ-11埠固定連著錢箱,所以你不用特別讀出原值作OR Bit4運算,直接測一下ON,OFF值即可。各式電子錢箱開啟位址及流程不一致,有些下「關->開」指令即可,有些得「關->開->關」才能把錢箱推回去。因應各種錢箱,我寫了一個C#類別來處理它,讀入不等長的Hex指令字串依實機狀況來設定,雖短短幾行,裏頭卻包含著一些與硬體打交道的程式兼容寫作經驗。
Sample Code

3 comments:

Liu Edward said...

您好, 請問Rj11CashDrawer有可以下載嗎?

我使用RW確認位置沒問題後
想使用inpout32.dll想達到一樣的效果,
, 卻無法正常運作, 所以想請問Rj11CashDrawer有沒有可以提供下載, 謝謝您.

Tomex Ou said...

我之前試inpout32也是有問題的,後來改用winio才ok (http://www.internals.com/) 另外,win64/win7模式下io被保護了,不一定能試成功,要實機在win32 xp下試看看才準。

Liu Edward said...

謝謝您的閱讀,
我在改使用winio後的確可以正常運作了,
只是需要在unsafe的環境下,
但是能正確的執行程式才是重點,
謝謝您的解答.