Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Como mandar comandos ESC/P a la impresora ?????

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Como mandar comandos ESC/P a la impresora ????? Responder citando

Tengo una impresora Epson conectada por USB y me gustaria saber ¿como puedo mandar comandos ESC/P (secuencias de escape) ?
Agradeceria cualquier ejemplo que me podais facilitar.
GRACIAS
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Un ejemplo usando la siguiente función:
Código:
void WriteRawTextToPrinter(String Title, String PrinterName, String S)
{
    HANDLE     Handle;
    DWORD      N;
    DOC_INFO_1 DocInfo1;

    if ( !OpenPrinter(PrinterName.c_str(), &Handle, NULL) )
        throw Exception("RawPrint-error: " + IntToStr(GetLastError()));

    DocInfo1.pDocName    = Title.c_str();
    DocInfo1.pOutputFile = NULL;
    DocInfo1.pDatatype   = "RAW";

    StartDocPrinter(Handle, 1, reinterpret_cast<LPBYTE>(&DocInfo1));
    StartPagePrinter(Handle);
    WritePrinter(Handle, S.c_str(), S.Length(), &N);
    EndPagePrinter(Handle);
    EndDocPrinter(Handle);
    ClosePrinter(Handle);
}
// Función original: http://bdn.borland.com/article/0,1410,15651,00.htm

Código:
 // Impresora predeterminada
 String impresora = Printer()->Printers->Strings[Printer()->PrinterIndex];

 //              ESC r (n)   - linea1,n=5 - linea2,n=6
 String texto = "\x1Br\x05 PRIMERA LINEA (EN ROJO)\r\n"
               "\x1Br\x06 SEGUNDA LINEA (EN VERDE)\r\n"
               "\x0C";  // Avance o expulsión de página

 WriteRawTextToPrinter("Titulo", impresora, texto);


Espero que te sirva. A mi me funciona en mi EPSON STYLUS PHOTO 870 conectada por el puerto USB, bajo Windows XP.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Prueba utilizar la siguiente funcion.. sacada de varios programas y puesta en la de Tips y Trucos...
https://cppbuilder.es/viewtopic.php?t=7940


Saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por las respuestas. Laughing

Concretando en mi problema, mi intención es de imprimir una matriz de pixels y controlar el color con el que se imprime cada pixel mediante comandos ESC/P. ¿Pueden utilizarse estas funciones para realizar esto? ¿de que manera?
Supongo que la solución es bastante mas complicada que solo imprimiendo texto. Me conformaría con que me orientaseis un poco. Estoy perdido en este tema.

Otra vez gracias a todos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Puedes enviar cualquier código. Aunque para imprimir gráficos en Windows no le veo mucha utilidad a complicarse la vida de esta manera. Además de que es demasiado dependiente de cada modelo de impresora.

Modificamos la función anterior, para que no se corte con los "\0" (terminador de cadena). Quedaría así:
Código:
void WriteRawTextToPrinter(String Title, String PrinterName, char* s, char len)
{
    HANDLE     Handle;
    DWORD      N;
    DOC_INFO_1 DocInfo1;

    if ( !OpenPrinter(PrinterName.c_str(), &Handle, NULL) )
        throw Exception("RawPrint-error: " + IntToStr(GetLastError()));

    DocInfo1.pDocName    = Title.c_str();
    DocInfo1.pOutputFile = NULL;
    DocInfo1.pDatatype   = "RAW";

    StartDocPrinter(Handle, 1, reinterpret_cast<LPBYTE>(&DocInfo1));
    StartPagePrinter(Handle);
    WritePrinter(Handle, s, len, &N);
    EndPagePrinter(Handle);
    EndDocPrinter(Handle);
    ClosePrinter(Handle);
}

Y a continuación un ejemplo lo mas básico que se me ha ocurrido y en negro, pero creo que es suficiente para que veas como enviar los códigos. Ahora siguiendo la referencia que tengas de los distintos códigos de EPSON ESC/P2 es cosa tuya:
Código:
// Impresora predeterminada
String impresora = Printer()->Printers->Strings[Printer()->PrinterIndex];

// Todos los códigos que enviaremos a la impresora
char* img =
  "\x1B@"                          /* Reseteamos la impresora */
  "\r\n"                           /* Avanzamos una línea */
  "\x1B(G\x01\x00\x01"             /* Activamos el modo grafico */
  "\x1B.\x00\x14\x14\x14\x10\x00"  /* Seleccionamos modo: 360x360dpi */

  /* Datos: 16x24pixels */
  /* El dibujo es un "monigote" (con un poco de imaginacion;) */
  "\x0F\xF0\x1F\xF8\x18\x18\x18\x18\x18\x18\x18\x18\x0F\xF0\x07\xE0"
  "\x01\x83\x01\x9F\x07\xFC\x1F\xE0\xF9\x80\xE1\x80\x01\x80\x01\x80"
  "\x03\xC0\x07\xE0\x0E\x70\x0C\x30\x1C\x38\x18\x18\x38\x1C\x30\x0C"

  "\x1B@\x0C";         /* Reseteamos la impresora + avance de página*/

WriteRawTextToPrinter("Titulo", impresora, img, 69 /*nº de bytes*/);


En mi EPSON STYLUS PHOTO 870 funciona correctamente, aunque supongo que debería funcionar bien en cualquier EPSON STYLUS en color, ya que solo hace uso del modo gráfico más básico de ESC/P2.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

MUCHAS GRACIAS, ya os comentaré que tal me ha ido.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

_Leo he probado tus ejemplos, tanto el de texto como el de gráficos, pero pese a que la impresora se pone a hacer cosas, no llega a coger ninguna hoja.
¿Sabéis cual puede ser el problema?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si la impresora hace algo cuando le envías los códigos, aunque mal, lo más probable es que no reconozca esos códigos. A mi lo que te he puesto me funciona correctamente.

¿Exactamente que modelo de impresora Epson, versión de Windows y BCB estas usando?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Lo he probado con una Epson C60, Windows XP y BCB 6.
Como comente la impresora empieza a hacer ruido, a mover los cabezales, pero no coge ninguna hoja.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Lo siento, en este momento no tengo otra impresora a mano. Puede que en breve pueda probarlo en una C84, ya te comentare. De momento si quieres, prueba el primer ejemplo quitando los códigos que empiezan por "\x" y dejando solo el texto, por ver si es que no entiende los códigos. Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:
ImprimeESC(dmDefiniciones->tbSucursales->FieldByName("impresora_area1")->AsString, (String) dmDefiniciones->tbSucursales->FieldByName("abrir_cajon")->AsString);


Modifique tu funcion anteroir y mando los datos que tengo guardados en mi base de datos para el corte de papel, si lo hago del modo que tengo arriba
NO FUNCIONA

pero si lo hago asi:
Código:
ImprimeESC(dmDefiniciones->tbSucursales->FieldByName("impresora_area1")->AsString, \x1D\x56\x42\x2C\x42\n );


SI FUNCIONA!!

no entiendo??
Volver arriba
Mensaje    Asunto: Responder citando

Código:

ImprimeESC(dmDefiniciones->tbSucursales->FieldByName("impresora_area1")->AsString, "\x1D\x56\x42\x2C\x42\n ");


CORRECCION VA CON COMILLAS[/code]
Volver arriba
Mensaje    Asunto: EUREKA Responder citando

Código:

//--------------------------------------------------
AnsiString SecuenciaEscape(AnsiString sCadena)
{
  char *cadena;
  cadena=sCadena.c_str();
  int iLong=sCadena.Length();
  int indice=1;
  int i=0;
  for(i=0;i<(iLong/3);i++)
   {
    AnsiString x=sCadena.SubString(indice,3);
    int ix=x.ToInt();
    cadena[i]=ix;
    indice=indice+3;
   }
   cadena[i+1]=' ';
   cadena[i]='\0';

return (AnsiString)cadena;
}


Lo logre!!!

lo que pasa que "\x010" o lo que sea es una constante, asi qeu tengoque guardar mis valores en DECIMAL en la tabla y hago una conversion del siguiente tipo:



Código:

ImprimeESC(dmDefiniciones->tbSucursales->FieldByName("impresora_area1")->AsString, SecuenciaEscape(tbTuTabla->FieldByName("tucampo")->AsString));


Donde en el campo esya guardado de la sig. forma:

027007008

3 espacios por codigo ascci
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.