Pregunta

Una experiencia humillante y creo que esta me dejará en ridículo, pero... estoy intentando convertir un antiguo programa de caja registradora a .net.Conquisté todo lo demás, pero no puedo abrir la caja registradora.Está conectado a COM1, se supone que debe enviar un texto "activador" por COM1 que hará que se abra el registro.

Aquí está el código .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!")

Recibo cuadros de mensajes "Señal enviada", "Cajón emergente listo"

Maldita sea, simplemente no explotará.Es un cajón de efectivo MS (EP125KC).Definitivamente conectado a COM1, definitivamente tiene energía.Chr(65) es el código antiguo utilizado para abrir el cajón y funciona:

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

NOTA:El código anterior funcionó correctamente.La raíz del problema fue causada por un cable de alimentación invertido (el negativo estaba en el lado equivocado).

¡Gracias por toda la ayuda chicos!

¿Fue útil?

Solución

Usted ha fijado su apretón de manos a ninguno, pero el cajón de dinero, probablemente tiene su propia idea. También establecer DTREnable en True. Chr (65) es el código ASCII para una "A", el código de VB sugiere el comando real es "AA".

Los documentos manuales que el cajón de la caja auto-templa su velocidad de transmisión. Se recomienda enviar al menos 20 caracteres @. Y que el comando real es Ctrl + G (Chr (7)). El comando "AA" podría haber funcionado anteriormente debido a un desajuste velocidad de transmisión. Tal vez.

Otros consejos

Si no recuerdo mi muy oxidada BASIC.

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

significa impresión para Port1 el carácter 65 seguido de la cadena "A", ahora es el carácter 65 'A', por lo que este me parece que debe ser el envío de "AA" para el puerto 1

port.Write("AA");

o alternativamente,

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

Podría estar enviando Unicode 65, lo que sería 0065, que no terminaría bien.

Es sólo una idea, puede que intente enviar un int prima?

Yo no uso .net, pero se almacenan temporalmente el puerto? Qué se necesita para enviar un rubor / fflush ()?

¿Estás seguro de que debes enviar este código?Siempre habría pensado que el código tiene el prefijo ESC, es decir.0x1b hexadecimal...para cajones de efectivo...

"\x1bA"

Es interesante que se use doble 'A'... oh bueno...:)

Editar: Después de pensar en esto me di cuenta que hay otra forma de hacerlo, sigue leyendo...He modificado tu código BASIC original con un poco de protección contra balas... guárdalo en 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

Descargue el antiguo compilador QB4.5 MS-Quick Basic y compílelo en un ejecutable, en opendrawer.exe, se puede encontrar el QB4.5 aquí.Ahora, la responsabilidad de hacer esto a prueba de balas recae en usted, es decir.¿Qué sucede si falla la escritura en COM1? Emite un mensaje como en el código BÁSICO de ejemplo que modifiqué.

Entonces puedes usar el System.Diagnostics.Process pagar usando una ventana oculta

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

El proceso se despliega en una ventana oculta y toda la salida se redirige y se maneja en el controlador de eventos... eso debería funcionar.Observe cómo la salida redirigida entra en el sbRedirectedOutput (una instancia de StringBuilder).En el proc_ProcExited controlador de eventos, verifica el sbRedirectedOutput para el mensaje 'Ups, error de escritura' que se emitiría desde el programa QB4.5.

Tenga en cuenta que es posible que necesite incluir la biblioteca de tiempo de ejecución del QB4.5 en el mismo directorio... no estoy 100% seguro... están pasando años...

¿Qué opinas?

Espero que esto ayude, Saludos cordiales, Tom.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top