Ir al contenido


Foto

Enviar bits al puerto serial


  • Por favor identifícate para responder
23 respuestas en este tema

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 noviembre 2013 - 08:48

buenos dias,


Estoy trabajando con la OCXde Epson para impresoras fiscales y estoy teniendo problemas con un campo especifico que es la extension, el cual debo enviar una cadena en forma de bits a la impresora, segun el manual:

Bit 0-2         ‘000’ – Factura a consumidor final.
‘001’ – Factura con derecho a crédito fiscal.
‘010’ – Nota de crédito a consumidor final.
‘011’ – Nota de crédito con derecho a crédito fiscal.
‘100’ – Factura a consumidor final con exoneración de ITBIS.
‘101’ – Factura con derecho a crédito fiscal con exoneración de
            ITBIS.
‘110’ – Nota de crédito a consumidor final con exoneración de ITBIS.
‘111’ – Nota de crédito con derecho a crédito fiscal con exoneración             de ITBIS.
Bit 3 Reservado.
Bit 4-5 ‘00’ – Utilizar fuente predeterminada.
‘01’ – Utilizar fuente tipo A.
‘10’ – Utilizar fuente tipo B.
‘11’ – Reservado.
Bit 6-8 ‘000’ – No realizar copias.
‘001’ – Realizar una copia.
‘010’ – Realizar dos copias.
‘011’ – Realizar tres copias.
‘100’ – Realizar cuatro copias.
‘101’ – Realizar cinco copias.
‘110’ – Realizar seis copias.
‘111’ – Realizar siete copias.
Bit 9 Reservado.
Bit 10 ‘0’ – Utilizar %Ley predeterminado.
              ‘1’ – No utilizar %Ley.
Bit 11-15 Reservados.


al enviar chr(0) + chr(1) se supone que estoy enviando 001.

Pero no entiendo mucho de esto, como podria hacer para lograr estas combinaciones, que me devuelve cada chr() en cada posicion??


Gracias

  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 noviembre 2013 - 09:01

Hola amigo,

Me parece que no, Char(0) y Char(1) no son '0' y '1', son los caracteres null y start of heading respectivamente, si quieres enviar la cadena '001' tienes varias alternativas,

  • La mandas tal cual --> '001'
  • La mandas como chr --> #48 + #48 + #49
  • La mandas como hexadecimal --> $30 + $30 + $31

Depende de tu componente y como trate las cadenas.

Saludos
  • 0

#3 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 noviembre 2013 - 09:46

Aqui es donde comienza mi confusion, por ejemplo en un control que solo maneja un bit

Bit 0 ‘1’ – Imprime reporte.
        ‘0’ – No imprime reporte

lo envio de esta forma

EpsonControl.AddDataField(chr(0) + chr(1));

y asi si funciona...
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 noviembre 2013 - 09:55

Pongo un ejemplo para estar mas claro, al enviar la siguiente cadena de bits,

0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1


Deberia enviar el chr(69) ????




  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 noviembre 2013 - 09:57

Aqui es donde comienza mi confusion, por ejemplo en un control que solo maneja un bit

Bit 0 ‘1’ – Imprime reporte.
        ‘0’ – No imprime reporte

lo envio de esta forma

EpsonControl.AddDataField(chr(0) + chr(1));

y asi si funciona...



Ahhhhh, ya ya, olvidalo, me estoy "meando fuera del hoyo", yo estoy pensando en Bytes no en bits :D

Deja aclarar mi mente y regreso :)

Saludos
  • 0

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 noviembre 2013 - 11:15

Pongo un ejemplo para estar mas claro, al enviar la siguiente cadena de bits,

0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1


Deberia enviar el chr(69) ????





Entiendo que si, ahora abría que determinar el orden de los bytes. Al tratarse de 16bits (2 bytes) habría que saber cual se envía primero el mas alto o el mas bajo.

Es decir chr(69) + chr(0)  o por el contrario chr(0) + chr(69)
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 noviembre 2013 - 11:18


Pongo un ejemplo para estar mas claro, al enviar la siguiente cadena de bits,

0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1



Deberia enviar el chr(69) ????



Entiendo que si, ahora abría que determinar el orden de los bytes. Al tratarse de 16bits (2 bytes) habría que saber cual se envía primero el mas alto o el mas bajo.

Es decir chr(69) + chr(0)  o por el contrario chr(0) + chr(69)


Me has ganado amigo seoane :)

Yo asumo que deberia ser char(0) + chr(69)

Hice un pequeño ejercicio, a ver si sirve de algo.


php
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. var
  3.   caracter1,
  4.   caracter2: string;
  5.  
  6.   Entero1,
  7.   Entero2: integer;
  8.  
  9.     function BinToInt(Value: string): Integer;
  10.     var
  11.       i, iValueSize: Integer;
  12.     begin
  13.       Result := 0;
  14.       iValueSize := Length(Value);
  15.       for i := iValueSize downto 1 do
  16.         if Value[i] = '1' then Result := Result + (1 shl (iValueSize - i));
  17.     end;
  18.  
  19.  
  20. begin
  21.   caracter1 := '00000000';
  22.   caracter2 := '01000101';
  23.  
  24.   Entero1 := BinToInt( caracter1 );
  25.   Entero2 := BinToInt( caracter2 );
  26.  
  27.   showMessage( format('%d - %d',[Entero1, Entero2]) );
  28.  


Saludos
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 noviembre 2013 - 05:03

Gracias, a todos, estas explicaciones era justo lo que necesitaba para aprender

Saludos
  • 0

#9 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 06 febrero 2014 - 07:36

Estimado:
Me he roto la cabeza con este protocolo (EpsonFPHostCOntrolX.ocx), sin embargo no logro hacer que la impresora TM-T88IV haga algo. No es problema de comunicación porque con drivers de pago logro hacer que imprima. Tienes algún ejemplo de código para enviar comandos a esta impresora, como un reporte Z o un ticket?. Te lo agradecería mucho.
Saludos desde Chile.
Atte.

  • 0

#10 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 06 febrero 2014 - 08:04

Para enviar a imprimir va a depender mucho del protocolo de la impresora, por lo cual debes tener un manual, yo la utilizo en Republica dominicana.


Basicamente lo que debes hacer es enviar comandos, para lo cual el OCX utiliza esto

 

delphi
  1. EpsonControlOcx.AddDataField(Comando); //Tantas veces como comandos se necesiten en una instruccion
  2.             EpsonControlOcx.SendCommand;
  3.  



Pero los comandos a enviar dependen del protocolo de la impresora, si nos compartes el codigo que utiizas podriamos ayudarte un poco

Saludos


  • 0

#11 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 06 febrero 2014 - 08:18

Estimado: estoy tomando como protoolo base este, considerando que no he encontrado el de la TM-T88IV, pero entiendo que es el mismo:
ftp://ftp.epson.com/latin/drivers/Impresoras/FiscalEASA/Manual/Manual_Protocolo_Compatible_220AFII_Hera_RevD.pdf

Para enviar un comando  a la impresora lo hago de la siguiente forma, según un código que conseguí en otro foro:



delphi
  1. //com1, baudios =9600 y protocolo extended previamente seteados.
  2. // Segun el manual, para avanzar papel-> 07 01
  3. EpsonFPHostControl1.AddDataField( #07#01);
  4. EpsonFPHostControl1.SendCommand;
  5. EpsonFPHostControl1.ClosePort;



Te agradecería sugerencias y asistencia.
Atte.

  • 0

#12 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 06 febrero 2014 - 10:08

Antes de eso abres el puerto?

Lo que se me ocurre de ser asi es que no sean los comandos, o estas trabajando en modo extendido y sean comandos del normal.

Saludos
  • 0

#13 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 06 febrero 2014 - 10:18

Olvidé poner esta parte....


delphi
  1. EpsonFPHostControl1.OpenPort;



Creo que la pregunta que debí hacer al principo es:
"Es correcta la forma de envío del comando?"
Lo otro, es que estoy monitereando el tráfico del COM1 y efectivamente envía datos, sin embargo por alguna razón (error mío, por supuesto) no hace nada el impresor.
Atento a tus comentarios.

  • 0

#14 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 10 febrero 2014 - 12:50

Estimados:
Alguien sabe como enviar comandos a esta impresora que contengas caracteres literales?. Por ejemplo, para enviar una impresión de texto no fiscal se debe enviar el comando "0E 01". Lo he intentado de distintas formas pero no lo he logrado enviar.
Les Agradezco cualquier ayuda.
  • 0

#15 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 10 febrero 2014 - 01:27

Estimados:
Alguien sabe como enviar comandos a esta impresora que contengas caracteres literales?. Por ejemplo, para enviar una impresión de texto no fiscal se debe enviar el comando "0E 01". Lo he intentado de distintas formas pero no lo he logrado enviar.
Les Agradezco cualquier ayuda.


¿Al final del envio le has agregado un retorno de carro? eso a veces es lo que a los dispositivos les permite saber que es el fin del comando.
  • 0

#16 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 10 febrero 2014 - 02:54

Lo intenté pero no funcionó... de todas maneras gracias por responder
  • 0

#17 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 11 febrero 2014 - 08:31

Prueba con esta Linea

EpsonFPHostControl1.AddDataField( #07+#01);

Es decir concatenando
  • 0

#18 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 11 febrero 2014 - 09:03

Gracias por responder Eduardo!
Esa línea funciona sin problemas (#07+#01), lo que estoy intentando enviar a la impresora es 0E 01, que sería como enviar

AddDataField(#0E#01)

Pero "#0E" no existe. Tambien probé enviando el valor decimal "#14" o el ascii "#69", sin resultados positivos .

Atento a los comentarios.
  • 0

#19 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 11 febrero 2014 - 05:35

Hola

Creo que la manera más sencilla de obtener los números a enviar es asignar una constante para cada opción, he identificado 4 grupos, así que les di nombres a las constantes de acuerdo al grupo, así el valor final a enviar al puerto será

TipoFactura + Fuente + Copias + Ley



delphi
  1. const
  2.   //Bit 0-2
  3.   TF0 = Word($0);  //‘000’ – Factura a consumidor final.
  4.   TF1 = Word($1);  //‘001’ – Factura con derecho a crédito fiscal.
  5.   TF2 = Word($2);  //‘010’ – Nota de crédito a consumidor final.
  6.   TF3 = Word($3);  //‘011’ – Nota de crédito con derecho a crédito fiscal.
  7.   TF4 = Word($4);  //‘100’ – Factura a consumidor final con exoneración de ITBIS.
  8.   TF5 = Word($5);  //‘101’ – Factura con derecho a crédito fiscal con exoneración de ITBIS.
  9.   TF6 = Word($6);  //‘110’ – Nota de crédito a consumidor final con exoneración de ITBIS.
  10.   TF7 = Word($7);  //‘111’ – Nota de crédito con derecho a crédito fiscal con exoneración de ITBIS.
  11.  
  12.   //Bit 3  Reservado.
  13.   //Bit 4-5 
  14.   F0 = Word($00)  //‘00’ – Utilizar fuente predeterminada. Equivale a 00000
  15.   F1 = Word($08);  //‘01’ – Utilizar fuente tipo A.        Equivale a      01000
  16.   F2 = Word($10);  //‘10’ – Utilizar fuente tipo B.        Equivale a      10000
  17.   F3 = Word($18);  //‘11’ – Reservado.                      Equivale a      11000
  18.  
  19.   //Bit 6-8
  20.   CP0 = Word($0);  //‘000’ – No realizar copias.          Equivale a    00000000
  21.   CP1 = Word($20);  //‘001’ – Realizar una copia.          Equivale a    00100000
  22.   CP2 = Word($40);  //‘010’ – Realizar dos copias.          Equivale a    01000000
  23.   CP3 = Word($60);  //‘011’ – Realizar tres copias.        Equivale a    01100000
  24.   CP4 = Word($80);  //‘100’ – Realizar cuatro copias.      Equivale a    10000000
  25.   CP5 = Word($A0);  //‘101’ – Realizar cinco copias.        Equivale a    10100000
  26.   CP6 = Word($C0);  //‘110’ – Realizar seis copias.        Equivale a    11000000
  27.   CP7 = Word($E0);  //‘111’ – Realizar siete copias.        Equivale a    11100000
  28.  
  29.   //Bit 9    Reservado.
  30.   //Bit 10
  31.   LY0 = Word($0);    //‘0’ – Utilizar %Ley predeterminado. Equivale a  0000000000
  32.   LY1 = Word($200);  //‘1’ – No utilizar %Ley.              Equivale a  1000000000
  33.   //Bit 11-15 Reservados.
  34.  
  35.  
  36.     Var  C : Word;
  37.     Begin
  38. //Ejemplo de
  39. //  TF2 = Word($2);    //‘010’ – Nota de crédito a consumidor final.  Equivale a        010
  40. //  F2 = Word($10);  // ‘10’ – Utilizar fuente tipo B.              Equivale a      10000
  41. //  CP3 = Word($60);  //‘011’ – Realizar tres copias.                Equivale a    01100000
  42. //  LY1 = Word($200);  //  ‘1’ – No utilizar %Ley.                    Equivale a  1000000000
  43. //                                                                                1001110010
  44.  
  45.         C := TF2 or F2 or CP3 or LY1;
  46.         //la variable C contiene dos bytes ya que es de tipo Word y quedaría así  00000010-01110010
  47.       ... aquí ya la rutina que envía al puerto....



donde la variable C es de tipo Word o equivalente a dos bytes, ya lo que debes hacer es enviar los dos bytes al puerto.

Espero ayude a simplificar la rutina

  • 0

#20 AntonioSAl

AntonioSAl

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 13 febrero 2014 - 05:48

Genial!
Será muy útil tu ayuda respecto a la extensión del comando. Mi real problema es la impresión de texto no fiscal, para enviar códigos de barra. Según el manual de protocolo extendido el comando es "0E 01"+ extensión. El problema lo tengo en el envío del comando en sí.
Gracias!
  • 0




IP.Board spam blocked by CleanTalk.