| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Davik Cdt

Registrado: 19 Nov 2003Mensajes: 5Ubicación: España
|
Publicado: Vie 21 May, 2004 5:02 pm Asunto: Como mandar comandos ESC/P a la impresora ????? |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 21 May, 2004 11:39 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 23 May, 2004 9:29 pm Asunto: |
|
|
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 _________________
 |
|
| Volver arriba |
|
 |
Davik Cdt

Registrado: 19 Nov 2003Mensajes: 5Ubicación: España
|
Publicado: Lun 24 May, 2004 10:21 am Asunto: |
|
|
Gracias por las respuestas.
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 25 May, 2004 1:55 am Asunto: |
|
|
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 |
|
 |
Davik Cdt

Registrado: 19 Nov 2003Mensajes: 5Ubicación: España
|
Publicado: Mar 25 May, 2004 7:52 am Asunto: |
|
|
| MUCHAS GRACIAS, ya os comentaré que tal me ha ido. |
|
| Volver arriba |
|
 |
Davik Cdt

Registrado: 19 Nov 2003Mensajes: 5Ubicación: España
|
Publicado: Mie 26 May, 2004 12:52 pm Asunto: |
|
|
_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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 26 May, 2004 9:53 pm Asunto: |
|
|
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 |
|
 |
Davik Cdt

Registrado: 19 Nov 2003Mensajes: 5Ubicación: España
|
Publicado: Jue 27 May, 2004 8:43 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 27 May, 2004 11:43 pm Asunto: |
|
|
| 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 |
|
 |
Invitado
|
Publicado: Lun 31 May, 2004 4:03 am Asunto: |
|
|
| 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 |
|
 |
Invitado
|
Publicado: Lun 31 May, 2004 4:04 am Asunto: |
|
|
| Código: |
ImprimeESC(dmDefiniciones->tbSucursales->FieldByName("impresora_area1")->AsString, "\x1D\x56\x42\x2C\x42\n ");
|
CORRECCION VA CON COMILLAS[/code] |
|
| Volver arriba |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Lun 31 May, 2004 5:36 am Asunto: EUREKA |
|
|
| 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 |
|
 |
|