Ouverture d'un MS-Tiroir-caisse, code incorrect? Bad Code?
-
19-09-2019 - |
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!
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.