2010-02-09 73 views
1

在这里谦恭地表明,我认为这个会让我变成一个傻瓜,但是......我试图将一个古老的收银机程序转换成.net。征服了其他所有东西,但我无法打开收银机。它连接到COM1,你应该向COM1发送一个“触发”文本,这将导致该寄存器打开。打开MS-Cash抽屉,错误代码?错误代码?

这是.net代码。

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-Cash抽屉(EP125KC)。绝对连接到COM1,绝对有力量。 CHR(65)是用于弹出抽屉的旧代码,它的工作原理:

Open drawerComPort For Output Access Write As #1 
Print #1, Chr$(65); "A"; 
Close #1 

注:上面的代码成功运行。根源问题是由于电源线受损(负面是错误的一面)。

感谢所有的帮助家伙!

+0

@Markus:我并没有注意到在注释掉的函数结束时没有关闭端口,MsgBox之前的行(“Done pop drawer”)..你能确认吗?也许钱箱不会弹出,直到你关闭了COM1端口后,代码发送后...考虑关闭端口作为'冲洗'出来的手段...... – t0mm13b 2010-02-09 01:08:17

+0

是的,意识到当我试图运行代码....它已被取消注释...这不是问题。 (FYI:我编辑了问题中的代码) – Markus 2010-02-09 01:16:38

+0

早上回来,现在,我在文本框中随机输入东西并通过COM1发送...没有甜蜜的“叮叮”。 – Markus 2010-02-09 01:51:12

回答

1

你已经设置你的握手,但无现金抽屉可能有自己的想法。还要将DtrEnable设置为True。 Chr(65)是“A”的ASCII码,你的VB代码表明真正的命令是“AA”。

该手册记录了现金抽屉自动调整其波特率。它建议发送至少20个字符。而真正的命令是Ctrl + G(Chr(7))。由于波特率不匹配,“AA”命令可能以前有效。也许。

+0

您可否详细说明,20 * chars或20 ctrl + g ...握手现在是否设置为RequestToSend。 – Markus 2010-02-09 01:29:50

+0

20 @ chars,1 Ctrl + G。你有手册吗? – 2010-02-09 01:31:36

+0

不幸的是...如果你有一个链接请分享 – Markus 2010-02-09 01:33:59

0

如果我记得我的非常生锈 BASIC。

Print #1, Chr$(65); "A"; 

意味着打印到PORT1其次是字符串“A”,现在字符65“A”字65,所以这看起来对我来说,你应该送“AA”到端口1

port.Write("AA"); 

或交替,

port.Write(new byte[]{65,'A'}, 0, 2); 
0

你确定你应该发出这段代码吗?我一直认为密码是通过ESC即0x1b十六进制前缀为...钱箱...

 
"\x1bA" 

有趣的是双“A”是用来...哦... :)

编辑:想着这个,我意识到有这样做的另一种方式后,阅读... 我有一点子弹校对的修改原来的BASIC代码...将它保存到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 

D下载旧的QB4.5 MS-Quick Basic编译器,并将其编译为可执行文件,编译为opendrawer.exe,QB4.5可以找到here。现在,你有责任做出这种防弹,即如果写入COM1失败,发出消息像例如BASIC代码,我修改

然后你可以使用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(StringBuilder实例)。在proc_ProcExited事件处理程序中,它会检查sbRedirectedOutput以获取将从QB4.5程序发出的消息'Oops Write failed'。

要知道,你可能需要包括QB4.5的运行时库在同一目录...不是100%肯定...它是多年...

你觉得呢?

希望这会有所帮助, 最好的问候, 汤姆。

0

它可能会发送Unicode 65,这将是0065,这将不会结束。

只是一个想法,你可以尝试发送一个原始的int?

0

我不使用.net,但端口缓冲?你需要发送一个flush/fflush()吗?

+0

SerialPort.Flush方法 - 发送在此SerialPort的发送缓冲区中等待的任何数据并清除缓冲区。 - 命名空间:System.IO.Ports - http://msdn.microsoft.com/en-us/library/dd169859.aspx – Mobs 2010-02-09 02:00:39