Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

omar.pessoa

WriteFile ou fprintf

Recommended Posts

Agora sim... Pessoal essa é @#$%#@$%

 

Tenho que imprimir via fprintf em uma impressora Epson. Problema, o que preciso imprimir são códigos de barras!

 

Alguém aqui saberia me dizer como fazer isso?

 

Tenho algo assim:

 

#define ESC_RESET "\x1B\x40"
#define ESC_FORM_FEED "\xC"
#define ESC_LINE_FEED "\x0D\x0A"
#define ESC_10CPI "\x1B\x50"  //10 cpi
#define ESC_12CPI "\x1B\x4D" //12 cpi
#define ESC_15CPI "\x1B\x67" //15 cpi
#define ESC_DRAFT_ON "\x1B\x78\x0"
#define ESC_DRAFT_OFF "\x1B\x78\x1"
#define ESC_TYPEFACE "\x1B\x6B"
#define ESC_CONDENSED_ON "\xF"
#define ESC_CONDENSED_OFF "\x12"
#define ESC_BOLD_ON "\x1B\x47"
#define ESC_BOLD_OFF "\x1B\x48"
#define ESC_ITALIC_ON "\x1B\x34"
#define ESC_ITALIC_OFF "\x1B\x35"
#define ESC_UNDERLINE_ON "\x1B\x2D\x31"
#define ESC_UNDERLINE_OFF "\x1B\x2D\x30"
#define ESC_SUPERSCRIPT_ON "\x1B\x53\x1"
#define ESC_SUPERSCRIPT_OFF "\x1B\x54"
#define ESC_LINE_SPACING_1_6 "\x1B\x32"
#define ESC_LINE_SPACING_1_8 "\x1B\x30"
#define ESC_LINE_SPACING_1_12 "\x1B\x33\x12" // last char: 24pin -> '\x0f'; 9pin -> '\x12'
#define ESC_ASSIGN_CHAR_TABLE "\x1B\x28\x74\x3\x0"
#define ESC_SELECT_CHAR_TABLE "\x1B\x74"
#define ESC_ENABLE_UPPER_PRINT "\x1B\x36"
#define ESC_MICRO_LINHA_09 "\x1B\x4A\x09"

#define ESC_TAMANHO_PAG "\x1B\x43\x44"

#define ESC_K "\x1B\x4B"
#define ESC_AST "\x1B\x2A\x00\x05\x02\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"

#define ESC_TESTE "\x1B\x4B\x96 \x1B\x71"
void ZDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	HANDLE hParallel = CreateFile("LPT1:", GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
	FILE_ATTRIBUTE_NORMAL, NULL);

	SetCommMask(hParallel, EV_RXFLAG);

	COMMTIMEOUTS parallelTimeouts;

	parallelTimeouts.ReadIntervalTimeout = MAXDWORD;
	parallelTimeouts.ReadTotalTimeoutMultiplier = 0;
	parallelTimeouts.ReadTotalTimeoutConstant = 0;
	parallelTimeouts.WriteTotalTimeoutMultiplier = 0;
	parallelTimeouts.WriteTotalTimeoutConstant = 0;

	SetCommTimeouts(hParallel, &parallelTimeouts);

	char cTeste[256];
	
	DWORD dwWriten;

	WriteFile(hParallel, ESC_RESET,strlen(ESC_RESET), &dwWriten,NULL);
	
	/*
        strcat(cTeste,"Omar");
	WriteFile(hParallel, cTeste,strlen(cTeste), &dwWriten,NULL);
	strcpy(cTeste, "Assim funciona\r\n");
	*/
	

	char *init="\n\x1b\x40";
	char *image="\x1b\x2a\x20\x40\x80";

	strcpy(cTeste,init);
	strcat(cTeste,image);
	WriteFile(hParallel, (char*)cTeste, strlen((char*)cTeste),&dwWriten,NULL);

	unsigned char data[3]={1,1,1};
	int i,j,k;
	for(j=0; j<8; j++)
	{
		WriteFile(hParallel, (char*)cTeste, strlen((char*)cTeste),&dwWriten,NULL);
		//data[i]=0xFF>>j;
		for(k=0;k<0x40;k++)
			WriteFile(hParallel, (char*)data, 3, &dwWriten,NULL);
	}
	FlushFileBuffers(hParallel);
	CloseHandle(hParallel);
}

Pelo que vi no manual, para setar o modo gráfico deve ser mandado para a impressora ESC * m n1 n2, onde m = 0 para 60 dpi, 1 para 120 (acho), e assim por diante... n1 e n2 seria a altura e largura...

 

Problema, como enviar depois do n1 e n2 os dados? Alguém já lidou com isso?

 

Valeus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhorando um pouco para o pessoal do fprint/fput

 

{
	FILE *fp;
	fp = fopen("LPT1", "wb");
	
	char adv872[3] = { 27, 'A', 8 };
	char dots408[4] = { 27, 'Z', 92, 1};
	char linefeed[2] = {10,0};
	char printrst[2] = { 27 ,'@' };
	char image;

	fwide(fp, 255);

	fprintf(fp,printrst);

	
	//PUT #1, , adv872$        ' Set printer linefeed to 8/72".
	fprintf(fp,adv872);

	char cBuffer[5][20] = 
	{
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
 		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255,
		255,255,255,255,255,255,255,255,255,255
	};
	//FOR x = 0 TO 89
	for (int x = 0; x < 5; x++)
	{
		//PUT #1, , dots408$  ' Set printer for bit image graphic mode.
	   fprintf(fp, dots408);
		//FOR y = 7740 + x TO x STEP -90
		for(int y = 0; y < 5; y++)
		{
			//FOR z = 24576 + y TO y STEP -8192
         for(int z = 0; z < 20; z++)
			{
				image = cBuffer[y][z];
            //PUT #1, , image$ ' Send bit-image graphics to printer.
				fputc(image, _T(fp));
			}
		}
		//PUT #1, , linefeed$   ' Send a linefeed to the printer.
		fputc(10, fp);
	}
   
	fputc(27,fp);
	fputc('@',fp);

	fprintf(fp,ESC_RESET);
	fclose(fp);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.