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「SignalSent」、「DonePopDrawer」が表示されます

ダン、ポップしない。これはMS-CashDrawer(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

.netを使用していませんが、ポートはバッファリングされていますか?flush / fflush()を送信する必要がありますか?

于 2010-02-09T01:58:24.547 に答える
0

さびたBASICを覚えていれば。

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

これは、ポート1に文字65の後に文字列 "A"を出力することを意味します。これで、文字65は'A'になります。したがって、これは、ポート1に"AA"を送信する必要があるように見えます。

port.Write("AA");

または代わりに、

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

このコードを送信してもよろしいですか?私はいつも、コードの前にESCが付いていると思っていました。つまり、キャッシュドロワーの場合は0x1b16進数です。

"\ x1bA"

ダブル「A」が使用されているのは興味深いです...まあ...:)

編集:これについて考えた後、私はそれを行う別の方法があることに気づきました、読んでください...私はあなたの元のBASICコードを少し防弾で変更しました...それをに保存しますopendrawer.bas

サブOpenDrawer()
drawerComPort = "COM1"
出力アクセス用にdrawerComPortを開きます書き込み#1
REMがエラー処理を追加しました
ON ERROR GOTO ErrHandler
印刷#1、Chr $(65); "A";
#1を閉じる
「引き出しOK」を印刷
OpenDrawer_Exit:
エラー時Goto0
サブを終了
ErrHandler:
「おっと、書き込みに失敗しました」を印刷します
OpenDrawer_Exitに移動します
サブ終了

REMメイン...
OpenDrawer

古いQB4.5MS-QuickBasicコンパイラをダウンロードし、それを実行可能ファイルにコンパイルしますopendrawer.exe。QB4.5はここにあります。さて、この防弾を作成する責任はあなたにあります。つまり、COM1への書き込みが失敗した場合はどうなるか、私が変更したBASICコードの例のようなメッセージを発行します。

次に、を使用System.Diagnostics.Processして、非表示のウィンドウを使用してシェルアウトできます

    パブリッククラスTestDrawer
    {{
        private StringBuilder sbRedirectedOutput = new StringBuilder();
        パブリック文字列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、 "キャッシュドロワーを開く際のエラー");
            }
            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イベントハンドラーでは、QB4.5プログラムから発行されるメッセージ「OopsWritefailed」をチェックしますsbRedirectedOutput

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

どう思いますか?

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-09T01:20:00.107 に答える
0

Unicode 65を送信している可能性がありますが、これは0065であり、うまく終了しません。

考えてみてください。生のintを送信してみてください。

于 2010-02-09T01:31:02.233 に答える