Question

Humbling expierence ici et je pense que celui-ci fera un fou de moi, mais ... Je suis en train de convertir un programme ancien caisse enregistreuse .net. Conquise tout le reste, mais je ne peux pas ouvrir pop la caisse enregistreuse. Son connecté à COM1, vous êtes censé envoyer un texte « déclencheur » vers le bas COM1 qui provoque le registre à ouvrir.

Voici le code .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!")

Je reçois msgboxes "signal envoyé", "Fait Pop tiroir"

chose Dang, juste ne sera pas pop. Il est un tiroir MS-Cash (EP125KC). Définitivement connecté à COM1, a certainement le pouvoir. Chr (65) est l'ancien code utilisé pour pop tiroir et cela fonctionne:

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

NOTE: Le code ci-dessus a travaillé avec succès. Le problème de la racine a été causée par un cordon d'alimentation reveresed (négatif était du mauvais côté).

Merci pour l'aide les gars!

Était-ce utile?

La solution

Vous avez défini votre poignée de main à Aucun, mais le tiroir-caisse a probablement sa propre idée. Également mis en DtrEnable sur True. Chr (65) est le code ASCII pour un "A", votre code VB indique la commande réelle est "AA".

Les documents manuels que le tiroir-caisse automatique tunes sa vitesse de transmission. Il recommande l'envoi d'au moins 20 caractères @. Et que la commande est réelle Ctrl + G (Chr (7)). La commande « AA » aurait pu fonctionner auparavant en raison d'un décalage de vitesse de transmission. Peut-être.

Autres conseils

Si je me souviens de ma très rouillés BASIC.

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

signifie impression pour PORT1 le caractère 65 suivi de la chaîne « A », maintenant le caractère 65 est « A », donc cela me semble que vous devriez envoyer « AA » à PORT1

port.Write("AA");

ou alternativement,

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

On peut envoyer Unicode 65, ce qui serait 0065, qui ne serait pas bien finir.

Juste une pensée, pouvez-vous essayer d'envoyer un int cru?

Je n'utiliser .net, mais le port est mise en tampon? avez-vous besoin d'envoyer une chasse d'eau / fflush ()?

Êtes-vous sûr que vous êtes censé envoyer ce code? Je l'ai toujours pensé que le code est préfixé par ESC à savoir 0x1b hexadécimal ... pour tiroirs caisse ...

"\x1bA"

Intéressant que le double 'A' est utilisé ... eh bien ...:)

Modifier Après avoir réfléchi à ce que j'ai réalisé il y a une autre façon de le faire, lisez la suite ... J'ai modifié votre code BASIC d'origine avec un peu de balles épreuvage ... enregistrez-le 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

Télécharger l'ancien QB4.5 MS-rapide compilateur de base, et la compilation qui à un exécutable, en opendrawer.exe, le QB4.5 se trouve ici . Maintenant, il incombe à vous de faire ce pare-balles, à savoir ce qui se passe si l'écriture sur COM1 échoue, numéro un message comme dans l'exemple de code BASIC I modifié

Ensuite, vous pouvez utiliser le System.Diagnostics.Process à débourser en utilisant une fenêtre cachée

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

Les shells sur une fenêtre cachée et toutes les sorties sont redirigés et manipulés dans le gestionnaire d'événements ... qui devrait faire l'affaire. Remarquez comment la sortie redirigée va dans le sbRedirectedOutput (une instance StringBuilder). Dans le gestionnaire d'événements proc_ProcExited, il vérifie la sbRedirectedOutput du message « Oops Write Failed » qui serait délivré du programme QB4.5.

Sachez que vous devrez peut-être inclure la bibliothèque d'exécution de temps du QB4.5 dans le même répertoire ... pas 100% sûr ... c'est d'être des années ...

Que pensez-vous?

Hope this helps, Meilleures salutations, Tom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top