1

在这里谦卑的经历,我认为这会让我出丑,但是......我正在尝试将一个古老的收银机程序转换为.net。征服了其他一切,但我无法打开收银机。它连接到 COM1,您应该向 COM1 发送一个“触发”文本,这将导致寄存器打开。

这是.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

注意:上面的代码成功运行。根本问题是由反向电源线引起的(负极在错误的一侧)。

感谢所有的帮助家伙!

4

5 回答 5

1

您已将握手设置为“无”,但收银机可能有自己的想法。还将 DtrEnable 设置为 True。Chr(65) 是“A”的 ASCII 代码,您的 VB 代码表明真正的命令是“AA”。

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

于 2010-02-09T01:15:53.913 回答
0

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

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

表示将字符 65 后跟字符串“A”打印到端口 1,现在字符 65 是“A”,所以在我看来,您应该将“AA”发送到端口 1

port.Write("AA");

或者,

port.Write(new byte[]{65,'A'}, 0, 2);
于 2010-02-09T01:13:06.487 回答
0

你确定你应该发送这个代码吗?我一直认为代码以 ESC 为前缀,即 0x1b 十六进制......对于现金抽屉......

"\x1bA"

有趣的是使用了双“A”......哦,好吧...... :)

编辑:考虑到这一点后,我意识到还有另一种方法,请继续阅读...我已经修改了您的原始 BASIC 代码,并进行了一些防弹...保存到opendrawer.bas

子 OpenDrawer()
抽屉ComPort = "COM1"
为输出访问打开抽屉ComPort 写为 #1
REM 添加错误处理
ON ERROR GOTO ErrHandler
打印 #1, Chr$(65); “一个”;
关闭 #1
打印“抽屉好”
OpenDrawer_Exit:
出错时转到 0
退出子
错误处理程序:
打印“糟糕,写入失败”
转到 OpenDrawer_Exit
结束子

REM 主要....
打开抽屉

下载旧的 QB4.5 MS-Quick Basic 编译器,并将其编译为可执行文件,进入opendrawer.exe,可以在此处找到 QB4.5 。现在,你有责任做到这一点,即如果写入 COM1 失败会发生什么,发出一条消息,就像我修改的示例 BASIC 代码一样

然后你可以使用System.Diagnostics.Process隐藏窗口

    公共类TestDrawer
    {
        私有 StringBuilder sbRedirectedOutput = new StringBuilder();
        公共字符串输出数据
        {
            得到 { 返回 this.sbRedirectedOutput.ToString(); }
        }
        公共无效运行()
        {
            System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo();
            ps.FileName = "打开抽屉";
            ps.ErrorDialog = 假;
            ps.CreateNoWindow = true;
            ps.UseShellExecute = 假;
            ps.RedirectStandardOutput = true;
            ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

            使用(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();
                而 (!proc.HasExited) ;
            }
        }

        void proc_Exited(对象发送者,EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("proc_Exited: Process Ended");
            if (this.sbRedirectedOutput.ToString().IndexOf("糟糕,写入失败") > -1){
               MessageBox.Show(this, "打开钱箱时出错");
            }
            if (this.sbRedirectedOutput.ToString().IndexOf("Drawer Ok") > -1){
               MessageBox.Show(this, "Drawer Ok");
            }
        }

        void proc_OutputDataReceived(对象发送者,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% 确定...这是几年...

你怎么看?

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

于 2010-02-09T01:20:00.107 回答
0

它可能会发送 Unicode 65,即 0065,这不会很好地结束。

只是一个想法,您可以尝试发送原始整数吗?

于 2010-02-09T01:31:02.233 回答
0

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

于 2010-02-09T01:58:24.547 回答