开MS-现金抽屉,错误的代码?糟糕代码?
-
19-09-2019 - |
题
震撼人心的经验研究在这里和我觉得这个人会做出愚蠢的我但是...我想转换一个古老的现金登记程序。网。征服其他的一切,但我不能打开收款机。其连接到COM1,你应该送一个"触发"的文字下COM1,将会导致登记册开放。
这里是。净码。
MsgBox("Opening Drawer")
Dim port As System.IO.Ports.SerialPort
port = New System.IO.Ports.SerialPort("Com1")
port.PortName = "COM1"
port.BaudRate = 9600
port.Parity = IO.Ports.Parity.None
port.DataBits = 8
port.StopBits = IO.Ports.StopBits.One
'port.Handshake = IO.Ports.Handshake.RequestToSend
port.RtsEnable = True
'port.DtrEnable = True
port.Open()
If port.IsOpen Then
'MsgBox("Attempt 1")
port.Write("@@@@@@@@@@@@@@@@@@@@")
MsgBox("Signal Sent: " & Chr(65))
Else
MsgBox("Port is not open")
End If
port.Close()
MsgBox("Pop, durn it!")
我得到msgboxes"信号的发送","做出的抽屉"
党的事情,就不会流行。这是MS-现金抽屉(EP125KC).肯定连接到COM1,肯定有权力。Chr(65)旧的代码,用于流行抽屉和它的工作:
Open drawerComPort For Output Access Write As #1
Print #1, Chr$(65); "A";
Close #1
注:上述代码的工作成功。根本的问题是引起一reveresed电源线(负是在错误的一边)。
感谢所有帮助的家伙!
解决方案
您已经将您的握手,但无现金抽屉可能有自己的想法。还设置DtrEnable为True。 CHR(65)是用于 “A” 的ASCII码,你的VB代码表明真正的命令是 “AA”。
在手动文件,现金抽屉自动调谐其波特率。它建议发送至少20 @字符。并且,真正的命令是Ctrl + G(CHR(7))。在“AA”命令可能会因波特率不匹配工作过。也许
其他提示
如果我记得我的很生疏的BASIC。
Print #1, Chr$(65); "A";
意味着打印到PORT1其次是字符串“A”,现在字符65“A”字65,所以这看起来对我来说,你应该送“AA”到端口1
port.Write("AA");
或可替换地,
port.Write(new byte[]{65,'A'}, 0, 2);
有可能被发送的Unicode 65,这将是0065,它不会结束好。
只是一个想法,你可以尝试发送原始INT?
我不使用.NET,但端口缓冲?你需要发送一个刷新/ fflush()?
你确定你应该发送出这个代码?我会一直认为,作为前缀码由ESC即0x1b十六...现金抽屉...
"\x1bA"
有趣的是,双'A'是使用...哦...:)
编辑: 之后思考关于这一点,我意识到还有另一种方式做到这一点,阅读。我已经修改了原来的基本码有一点弹防...保存它 opendrawer.bas
Sub OpenDrawer() drawerComPort = "COM1" Open drawerComPort For Output Access Write As #1 REM ADDED ERROR HANDLING ON ERROR GOTO ErrHandler Print #1, Chr$(65); "A"; Close #1 print "Drawer Ok" OpenDrawer_Exit: On Error Goto 0 Exit Sub ErrHandler: print "Oops, Write Failed" Goto OpenDrawer_Exit End Sub REM The Main.... OpenDrawer
下载旧QB4.5MS-快的基本编译器,并汇编到一个可执行的,变成 opendrawer.exe
, ,QB4.5可以找到 在这里,.现在,责任在你做这件防弹,即会发生什么情况,如果书面COM1失败,发出一个信息,如在例如基本码我修改
然后你可以使用 System.Diagnostics.Process
掏出使用隐藏的窗口
public class TestDrawer { private StringBuilder sbRedirectedOutput = new StringBuilder(); public string OutputData { get { return this.sbRedirectedOutput.ToString(); } } public void Run() { System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo(); ps.FileName = "opendrawer"; ps.ErrorDialog = false; ps.CreateNoWindow = true; ps.UseShellExecute = false; ps.RedirectStandardOutput = true; ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; using (System.Diagnostics.Process proc = new System.Diagnostics.Process()) { proc.StartInfo = ps; proc.Exited += new EventHandler(proc_Exited); proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived); proc.Start(); proc.WaitForExit(); proc.BeginOutputReadLine(); while (!proc.HasExited) ; } } void proc_Exited(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine("proc_Exited: Process Ended"); if (this.sbRedirectedOutput.ToString().IndexOf("Oops, write failed") > -1){ MessageBox.Show(this, "Error in opening Cash Drawer"); } if (this.sbRedirectedOutput.ToString().IndexOf("Drawer Ok") > -1){ MessageBox.Show(this, "Drawer Ok"); } } void proc_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) { if (e.Data != null) this.sbRedirectedOutput.Append(e.Data + Environment.NewLine); //System.Diagnostics.Debug.WriteLine("proc_OutputDataReceived: Data: " + e.Data); }
该进程炮弹推到一个隐藏的窗口和所有输出是重新定向和处理中的事件的处理程序...,应该做到。通知中,如何重新定向进入输出 sbRedirectedOutput
(a StringBuilder的实例)。在 proc_ProcExited
事件处理程序,检查的 sbRedirectedOutput
为消息'哎呀写的失败'这将是发出的QB4.5程序。
要知道,你可能需要包括QB4.5的运行时间图书馆目录相同的...不是100%肯定.这是多年...
你怎么想?
希望这会有所帮助, 最好的问候, 汤姆。