MS-キャッシュドロワ、間違ったコードを開きますか?不正なコード?

StackOverflow https://stackoverflow.com/questions/2226008

  •  19-09-2019
  •  | 
  •  

質問

ここで

屈辱expierenceと私はこの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-キャッシュドロア(EP125KC)です。確かに間違いなく力を持って、COM1に接続されています。 CHR(65)は、引き出しを開くために使用される古いコードで、それが動作します:

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

注:上記のコードが正常に働いていました。根本的な問題は、(負の間違った側にあった)reveresed電源コードによって引き起こされた。

すべてのヘルプみんなありがとう!

役に立ちましたか?

解決

あなたはなしに、あなたのハンドシェイクを設定しましたが、現金の引き出しはおそらく、独自のアイデアを持っています。また、TrueにDtrEnableを設定します。 CHR(65)は、あなたのVBのコードは、実際のコマンドが "AA" であることを示唆している、 "A" のASCIIコードです。

キャッシュドロワそのボーレートを自動調整し、マニュアルの文書。これは、文字@、少なくとも20の送信を推奨しています。そして、それは本当のコマンドは、Ctrlキー+ G(CHR(7))です。 「AA」コマンドが原因ボーレートの不一致に以前に働いている可能性があります。多分ます。

他のヒント

私は私を覚えている場合は、の非常に錆びのBASIC。

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

文字列「A」に続く文字65をPORT1するプリントを意味し、今文字65は、「A」であるので、あなたは、

PORT1する「AA」を送付しなければならないように、これは私には見えます
port.Write("AA");

または交互に、

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

よく終わらないであろう、0065だろうUnicodeの65を、送信される可能性があります。

ただ、思考、あなたは生のint型の送信を試みることができますか?

私は、.NETを使用してはいけない、しかしポートはバッファリングされていますか?あなたはフラッシュ/にfflushを送信する必要がありますか()?

あなたはこのコードを送ることになっていますか?私はいつも現金引き出しのために...コードはESCすなわちとして0x1B進が付けられていると考えているだろう...

"\x1bA"

ダブル 'A' が使用されていることは興味深い...まあいい...:)

編集は、このことを考えた後、私は読んで、それを行うための別の方法があります実現... 私はopendrawer.basするためにそれを保存...弾丸プルーフのビットを使用して、元のBASICコードを変更しました。

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.5 MS-クイックBasicコンパイラをダウンロードして、opendrawer.exeに、実行ファイルにそれをコンパイルし、QB4.5は<のhref = "http://www.phatcode.net/downloads.php見つけることができます?ID = 172" のrel = "nofollowをnoreferrer">ここを。今、責任は私が

変形例BASICコード内のようなメッセージを発行し、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(StringBuilderのインスタンス)に入る方法に注目してください。 proc_ProcExitedイベントハンドラでは、QB4.5プログラムから発行されることになるメッセージ「おっと失敗書く」のsbRedirectedOutputをチェックします。

あなたが同じディレクトリにQB4.5のランタイムライブラリを含める必要があるかもしれないことに注意して下さい... 100%確実ではない...それは何年ものだ...

あなたはどう思いますか?

これが、お役に立てば幸い 宜しくお願いします、 トムます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top