Frage

Humbling expierence hier und ich denke, das mich zum Narren machen, aber ... Ich versuche, ein altes Kassenprogramm zu konvertieren .net. Erobert alles andere, aber ich kann nicht knallen die Kasse öffnen. Sein mit COM1, Sie sollen einen „Trigger“ Text unten COM1 senden, die das Register zu öffnen führen.

Hier ist der .NET-Code.

    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!")

Ich bekomme MsgBoxes "Signal gesendet", "Fertig Pop-Fach"

Dang Sache, die einfach nicht Pop. Es ist eine MS-Kassenschublade (EP125KC). Auf jeden Fall an COM1 angeschlossen ist, auf jeden Fall mit Strom versorgt. Chr (65) ist der alte Code verwendet Schublade Pop und es funktioniert:

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

Hinweis: Der obige Code erfolgreich gearbeitet. Das eigentliche Problem durch einen reveresed Netzkabel verursacht wurde (negativ auf der falschen Seite war).

Vielen Dank für all die Hilfe Jungs!

War es hilfreich?

Lösung

Sie haben Ihr Händedruck auf keine festgelegt, aber die Kassenschublade wahrscheinlich seine eigene Idee hat. Auch DTREnable auf True gesetzt. Chr (65) ist der ASCII-Code für ein "A", Ihr VB-Code schlägt der eigentliche Befehl ist "AA".

Das Handbuch dokumentiert, dass die Kassenschublade seine Baudraten automatisch abstimmt. Es empfiehlt mindestens 20 @ Zeichen zu senden. Und dass der eigentliche Befehl Strg + G (Chr (7)). Der „AA“ Befehl könnte vorher gearbeitet hat, aufgrund einer Baudraten stimmt nicht überein. Vielleicht.

Andere Tipps

Wenn ich erinnere mich an sehr rostig BASIC.

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

bedeutet Druck das Zeichen 65 durch die Zeichenfolge „A“ gefolgt port1, nun das Zeichen 65 ist ‚A‘, so sieht das für mich wie Sie zu senden sollten „AA“ port1

port.Write("AA");

oder alternativ

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

Es könnte 65 Unicode das Senden, das 0065 sein würde, die gut enden würde nicht.

Nur ein Gedanke, können Sie versuchen, ein rohes int Senden?

ich nicht .net verwenden, aber die Port gepuffert? Sie braucht einen Flush / fflush ()?

senden

Sind Sie sicher, dass Sie sollen diesen Code auszusenden? Ich hätte immer gedacht, dass der Code von ESC heißt Präfix wird 0x1b hexadezimal ... für Kassenschubladen ...

"\x1bA"

Interessant, dass Doppel 'A' verwendet wird ... na ja ...:)

Edit: Nach dem darüber nachgedacht wurde mir klar, es gibt einen anderen Weg, es zu tun, lesen Sie weiter ... Ich habe Ihren ursprünglichen BASIC-Code mit einem wenig Kugel-Proofing geändert ... speichert bis 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

Laden Sie die alte QB4.5 MS-Quick Basic Compiler und kompiliert, das zu einer ausführbaren Datei, in opendrawer.exe kann die QB4.5 gefunden werden hier . Nun, die Beweislast auf Sie ist es, diese kugelsicher zu machen, das heißt, was passiert, wenn an COM1 Schreiben fehlschlägt, Ausgabe eine Meldung wie im Beispiel BASIC-Code I modifiziert

Dann können Sie die System.Diagnostics.Process verwenden, um zu berappen ein ausgeblendetes Fenster mit

    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);
        }

Die Prozessschalen aus zu einem versteckten Fenster und alle Ausgaben umgeleitet werden und in dem Event-Handler behandelt ..., die den Trick tun soll. Beachten Sie, wie die umgeleiteten Ausgabe der sbRedirectedOutput geht in (a String Beispiel). Im proc_ProcExited Event-Handler, prüft er die sbRedirectedOutput für die Nachricht ‚Oops Schreiben fehlgeschlagen‘, die aus dem QB4.5 Programm ausgegeben würden.

Beachten Sie, dass Sie die QB4.5 der Laufzeitbibliothek im selben Verzeichnis enthalten müssen können ... nicht 100% sicher ... es ist Jahre ...

Was denken Sie?

Hope, das hilft, Freundliche Grüße, Tom.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top