⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bh10.cpp

📁 vt100终端仿真程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BH10.cpp : Defines the entry point for the console application.
//csAuxCom.SendData(szDataBuf,dwLen)
//csAuxCOm.RcvData(szDataBuf,&dwLen)
#include "stdafx.h"
#include "windows.h"
#include "Bh10.h"
#include "ComPort.h"
//#include "time.h"

#include "auxport.h"

int gLineSpace=20;
int gCurrRow=1;
int gCurrCol;

extern CComPort csAuxCom;
extern int fFont;
extern int FirstJddw;
extern int bOKI;
extern int bChinese;

int bDoubleHigh=0;//倍高标志
int bDoubleWidth=0;//倍宽标志
int bPaperIn=0;
int iStartPrint=0;//0:未进纸;1:逻辑进纸(PR2);2:逻辑退纸(PR2),实际进纸(BH10)

int iChangeCode;//英文字符、汉字转换标志


///////////////////////////////////////////
//Bh10打印缓冲区
BH10BUF Bh10Buf[512];
int Bh10BufLen;

int Bh10Reset()//	Reset(总清)
{
	char ReceBuf[128];
	DWORD iBytes;

	csAuxCom.SendData("\x02\x01\x00\x32\x03\x36",6);
	memset(ReceBuf,0x00,sizeof(ReceBuf));
	csAuxCom.RcvData(ReceBuf,&iBytes);

	csAuxCom.SendData("\x05",1);
	memset(ReceBuf,0x00,sizeof(ReceBuf));
	csAuxCom.RcvData(ReceBuf,&iBytes);

	while(strcmp(ReceBuf,"\x06")!=0)
	{
		csAuxCom.SendData("\x05",1);
		memset(ReceBuf,0x00,sizeof(ReceBuf));
		csAuxCom.RcvData(ReceBuf,&iBytes);
		if (iBytes>1)
		{
			csAuxCom.SendData ("\x06\x05",2);
			memset(ReceBuf,0x00,sizeof(ReceBuf));
			csAuxCom.RcvData(ReceBuf,&iBytes);
		}

	}

	bPaperIn=0;
	return 0;
}


int Bh10PaperIn()//	进纸
{

	Bh10BufLen=0;
	
	//SendCommToBh10("\x1b\x2d\x9f\x1b\x2d\x9f\x1b\x2d\x9f\x8e\xa2\x21\x21\x8e\xa1\x0d",16);
	SendCommToBh10("\x1b\x2d\x9f\x1b\x2d\x9f\x1b\x2d\x9f",9);
	SendCommToBh10("\x0d\x1b\x2d\x00",4);
	SendCommToBh10("\x1b\x66",2);
	Bh10PrintData("\xa1\xa1",2);
	SendCommToBh10("\x0d\x1b\x2d\x00",4);
	SendCommToBh10("\x1b\x67",2);
	SendCommToBh10("\x1b\x4d",2);
	SendCommToBh10("\x0d",1);
	SendCommToBh10("\x0d\x1b\x2d\x00",4);
	SendCommToBh10("\x1b\x49\x40\x4c",4);

	
	bPaperIn=1;
	iStartPrint=1;
	bChinese=1;

	
	return 0;
}


int Bh10PaperOut()//	退纸
{

	int iRet;
	int iSele;
	
//	CloseAuxPort();
//	OpenAuxPort11();

	bDoubleWidth=0;
	bDoubleHigh=0;

	iRet=Bh10Print();

	
	while (iRet!=0)
	{
		switch (iRet)
		{
		case 1:
			MessageBox(NULL,TEXT("打印机未联结或状态错误,请检查!"),TEXT("提示"),MB_OK);
			break;
		case 2:
			MessageBox(NULL,TEXT("进纸错误,请重新进纸!"),TEXT("提示"),MB_OK);
			break;
		case 3:
			iSele=MessageBox(NULL,TEXT("打印错误,按OK重打,按CANCEL取消"),TEXT("提示"),MB_OKCANCEL);
			if (iSele==IDCANCEL)
			{
				CloseAuxPort();
				return 0;
			}
			break;
		case 4:
			iSele=MessageBox(NULL,TEXT("打印错误,按OK重打,按CANCEL取消"),TEXT("提示"),MB_OKCANCEL);
			if (iSele==IDCANCEL)
			{
				CloseAuxPort();
				return 0;
			}
			break;
		}
		iRet=Bh10Print();
	}
		
	CloseAuxPort();
	return 0;
}

int Bh10LineMove(int Direct, int Lines)//	相对行定位
{

	unsigned char m,n;
	int i;
	char SendBuf[10];

	if (bPaperIn==0 && bOKI==0) return 0;

	if (bDoubleHigh) gLineSpace=gLineSpace-4;

	m=gLineSpace/64;
	n=gLineSpace%64;
	


	if (Direct==0)
	{
		m=m+64;
		n=n+64;
		memset(SendBuf,0x00,sizeof(SendBuf));
		SendBuf[0]='\x1b';
		SendBuf[1]='\x49';
		SendBuf[2]=m;
		SendBuf[3]=n;

//		if (Lines>2) Lines-=2;
		for (i=0;i<Lines;i++)
		{
			SendCommToBh10("\x0d\x1b\x2d\x00",4);
			SendCommToBh10(SendBuf,4);
		}
	}
	else
	{
		m=m+192;
		n=n+64;
		memset(SendBuf,0x00,sizeof(SendBuf));
		SendBuf[0]='\x1b';
		SendBuf[1]='\x49';
		SendBuf[2]=m;
		SendBuf[3]=n;


		for (i=0;i<Lines;i++)
		{
			SendCommToBh10("\x0d\x1b\x2d\x00",4);
			SendCommToBh10(SendBuf,4);
		}
	}

	if (bDoubleHigh) gLineSpace=gLineSpace+4;

	iChangeCode=0;

//	gCurrCol=1;
	return 0;
}

int EccByte(char * szDataBuf,int DataLen)//ECC校验位
{
	unsigned char ch;
	int i;

	ch=0;
	for (i=1; i<DataLen; i++)
		ch+=(unsigned char)szDataBuf[i];

	szDataBuf[DataLen]=ch;
	
	return 0;
}


int Bh10PrintData1(char * szDataBuf, int DataLen, int iDoubleHigh)//输出字符
{
	char SendBuf[1024];
	char szDataBuf1[1024],szDataBuf2[1024],szDataBuf3[1024];
	int i,j,k;
	int fSpace=0;

	int FirstByte;
	int iSpace=6;

	short int iLen=0;
	int SendLen=0;
	int Status;
	int times;

	int lByte,hByte,WordSite;
	long FileOff;
	HANDLE hFile;
	DWORD Bytes;
	char Zkdz[100];

	if (DataLen==0) return 0;


	memset(szDataBuf1,0x00,sizeof(szDataBuf1));
	
	k=0;
	j=0;
	FirstByte=0;
	for(i=0;i<DataLen;i++)
	{
		if (i<DataLen-1)
		{
			if (FirstByte==0)
			{
				if ((unsigned char)szDataBuf[i]>128 && (unsigned char)szDataBuf[i+1]>=64)
					FirstByte=1;
			}
			else
				FirstByte=0;
		}
		else 
			FirstByte=0;

		if (szDataBuf[i]=='$' || szDataBuf[i]=='\x9d' && FirstByte==0)
		{ 
			if (szDataBuf[i]=='$')
			{
				szDataBuf1[k++]='\xaa';
				szDataBuf1[k++]='\xa4';
				j++;
			}
			if (szDataBuf[i]=='\x9d')
			{
				if ((unsigned char)szDataBuf[i+1]<0x40)
				{
					szDataBuf1[k++]='\xaa';
					szDataBuf1[k++]='\xa4';
					j++;
				}
				else
					szDataBuf1[k++]='\x9d';
			}
		}
		else
		{
			if (szDataBuf[i]=='\xa1' && szDataBuf[i+1]=='\xc3' && FirstByte==1)
			{
				szDataBuf1[k++]=':';
				i++;
				j--;
			}
			else
			{
				if (szDataBuf[i]=='\xa3' && szDataBuf[i+1]=='\xac' && FirstByte==1)
				{
					szDataBuf1[k++]=',';
					i++;
					j--;
				}
				else
				{
					if (szDataBuf[i]=='\xa3' && szDataBuf[i+1]=='\xaa' && FirstByte==1)
					{
						szDataBuf1[k++]='*';
						i++;
						j--;
					}
					else
						szDataBuf1[k++]=szDataBuf[i];
				}
			}
		}
	}
	DataLen+=j;
//	memcpy(szDataBuf1,szDataBuf,DataLen);


//Font15打印	
	if (fFont==1)
	{
		if (DataLen>90)
		{
			while (szDataBuf1[DataLen-1]=='\x20') 
				DataLen--;
		}
///////////////////////////////////////////////////////////////		
		memcpy(szDataBuf3,szDataBuf1,sizeof(szDataBuf1));
		int DataLen1=DataLen;
		while (szDataBuf3[DataLen1-1]=='\x20')
			DataLen1--;
////////////////////////////////////////////////////////////////

		times=0;
		do
		{
			if (DataLen1<12/*66*/ && DataLen>10) break;
			j=0;
			k=0;
			int StartChar=0;

			

			memset(szDataBuf2,0x00,sizeof(szDataBuf2));
			for (i=0;i<DataLen;i++)
			{
				if (szDataBuf1[i]!='\x20')
				{
					szDataBuf2[j++]=szDataBuf1[i];
					fSpace=0;
					StartChar=1;
				}
				else
				{
					if (StartChar==1)
					{
						if (fSpace==iSpace || fSpace==8 || fSpace==16)
							k++;
						else
							szDataBuf2[j++]=szDataBuf1[i];
//						if (fSpace==iSpace)
//						{
//							fSpace=0;
//							iSpace+=2;
//						}
					}
					else
					{
						if (fSpace==40 || fSpace==50 ||fSpace==60 ||fSpace==70)
							k++;
						else
							szDataBuf2[j++]=szDataBuf1[i];

					}

					fSpace++;
				}
			}

			DataLen-=k;
			if (iSpace>2) iSpace--;

			memcpy(szDataBuf1,szDataBuf2,sizeof(szDataBuf2));

			times++;

			if (k==0 && iSpace==2) break;
		
		} while (DataLen>102 || (k<4 && times<2));

		if (DataLen>102) DataLen=102;

		Bh10PrintFont15(szDataBuf1,DataLen,iDoubleHigh);
		return 0;

	}
	

	
//大字打印	
	memset(SendBuf,0x00,sizeof(SendBuf));
	iLen=0;
	Status=0;

	hFile=   CreateFile(TEXT("gbk.24"),
						GENERIC_READ,
						FILE_SHARE_READ,
						NULL,
						OPEN_EXISTING,
						FILE_ATTRIBUTE_NORMAL,
						0);

	if (hFile==INVALID_HANDLE_VALUE)
		return 0;


	for (i=0;i<DataLen;i++)
	{
		if ((unsigned char)szDataBuf1[i]>=128)
		{
			if ((unsigned char)szDataBuf1[i]>160 && (unsigned char)szDataBuf1[i+1]>160)
			{
				if (Status==0)
				{
					memcpy(SendBuf+iLen,"\x8e\xa2",2);
					iLen+=2;
				}
				SendBuf[iLen++]=(unsigned char)szDataBuf1[i]-128;
				SendBuf[iLen++]=(unsigned char)szDataBuf1[i+1]-128;
				i++;
				Status=1;
			}
			else
			{
				SendDataToBh10(SendBuf,iLen,0);
				memset(SendBuf,0x00,sizeof(SendBuf));
				iLen=0;
				Status=0;

				memset(Zkdz,0x00,sizeof(Zkdz));
				Zkdz[0]='\x1b';
				Zkdz[1]='\x4b';

				hByte=(unsigned char)szDataBuf1[i];
				lByte=(unsigned char)szDataBuf1[i+1];
				if (lByte<0x80)
					WordSite=(hByte-0x81)*190+lByte-0x40;
				else
					WordSite=(hByte-0x81)*190+lByte-0x41;

				FileOff=WordSite*72;
				SetFilePointer(hFile,FileOff,NULL,FILE_BEGIN);
				ReadFile(hFile,Zkdz+2,72,&Bytes,NULL);
				SendDataToBh10(Zkdz,74,0);
				i++;

			}
		}
		else
		{
			if (Status==1)
			{
				memcpy(SendBuf+iLen,"\x8e\xa1",2);
				iLen+=2;
			}
			SendBuf[iLen++]=szDataBuf1[i];
			Status=0;
		}
	}
	if (iLen>0)
		SendDataToBh10(SendBuf,iLen,0);
	CloseHandle(hFile);

/*	memset(ReceBuf,0x00,sizeof(ReceBuf));
	while (strcmp(ReceBuf,"\x06")!=0)
	{
		csAuxCom.SendData("\x05",1);
		memset(ReceBuf,0x00,sizeof(ReceBuf));
		csAuxCom.RcvData(ReceBuf,&iBytes);
		if (iBytes>1)
		{
			csAuxCom.SendData ("\x06\x05",2);
			memset(ReceBuf,0x00,sizeof(ReceBuf));
			csAuxCom.RcvData(ReceBuf,&iBytes);
		}
	}

	memset(DataBuf,0x00,sizeof(DataBuf));
	memset(SendBuf,0x00,sizeof(SendBuf));

	memcpy(DataBuf+iLen,"\x30",1);
	iLen+=1;

	if ((unsigned char)szDataBuf1[0] >160)
	{
		memcpy(DataBuf+iLen,"\x8e\xa2",2);
		Status=1;
	}
	else
	{
		memcpy(DataBuf+iLen,"\x8e\xa1",2);
		Status=0;
	}
	iLen+=2;

	for (i=0;i<DataLen;i++)
	{
		if (Status==0 && (unsigned char)szDataBuf1[i]>160)
		{
			memcpy(DataBuf+iLen,"\x8e\xa2",2);
			Status=1;
			iLen+=2;
		}

		if (Status==1 && (unsigned char)szDataBuf1[i]<=160)
		{
			memcpy(DataBuf+iLen,"\x8e\xa1",2);
			Status=0;
			iLen+=2;
		}
		
		if (Status==0)
			DataBuf[iLen++]=szDataBuf1[i];
		else
			DataBuf[iLen++]=(unsigned char)szDataBuf1[i] - 128;
	}

	
	memcpy(SendBuf+SendLen,"\x02",1);
	SendLen+=1;

	memcpy(SendBuf+SendLen,&iLen,2);
	SendLen+=2;

	memcpy(SendBuf+SendLen,DataBuf,iLen);
	SendLen+=iLen;

	memcpy(SendBuf+SendLen,"\x03",1);
	SendLen+=1;

	EccByte(SendBuf,SendLen);
	SendLen+=1;

	csAuxCom.SendData(SendBuf,SendLen);
	memset(ReceBuf,0x00,sizeof(ReceBuf));
	csAuxCom.RcvData(ReceBuf,&iBytes);
*/
	return 0;
	
}

int Bh10AskStatus()//	状态查询
{
	char ReceBuf[128];
	DWORD iBytes;

	memset(ReceBuf,0x00,sizeof(ReceBuf));
	while (strcmp(ReceBuf,"\x06")!=0)
	{
		csAuxCom.SendData("\x05",1);
		memset(ReceBuf,0x00,sizeof(ReceBuf));
		csAuxCom.RcvData(ReceBuf,&iBytes);
		if (iBytes>1)
		{
			csAuxCom.SendData ("\x06\x05",2);
			memset(ReceBuf,0x00,sizeof(ReceBuf));
			csAuxCom.RcvData(ReceBuf,&iBytes);
		}

	}


	csAuxCom.SendData("\x02\x01\x00\x31\x03\x35",6);
	memset(ReceBuf,0x00,sizeof(ReceBuf));
	csAuxCom.RcvData(ReceBuf,&iBytes);

	csAuxCom.SendData("\x05",1);
	memset(ReceBuf,0x00,sizeof(ReceBuf));
	csAuxCom.RcvData(ReceBuf,&iBytes);

	while (strcmp(ReceBuf,"\x06")==0)
	{
		csAuxCom.SendData("\x05",1);
		memset(ReceBuf,0x00,sizeof(ReceBuf));
		csAuxCom.RcvData(ReceBuf,&iBytes);

	}

	csAuxCom.SendData("\x06",1);
	

	if (strcmp(ReceBuf+3,"\x20\x40\x40\x49\x40\x03\x31")==0)//&& strcmp(ReceBuf+3,"\x20\x40\x40\x40\x40\x03\x28"))
		return 1;
	else
		return 0;
}

int Bh10SetDoubleHigh()//	设置倍高
{
	
	SendCommToBh10("\x1b\x8a",2);
	SendCommToBh10("\x1b\x49\xc0\x4c",4);
	SendCommToBh10("\x1b\x2d\x00",3);
	bDoubleHigh=1;
	if (bOKI==1)
		SendCommToBh10("            ",12);

	return 0;
}

int Bh10SetNormal()//	取消倍高
{
	if (bOKI==1)
	{
//		SendCommToBh10("\x1b\x49\xc0\x4c",4);
		SendCommToBh10("\x0d\x1b\x2d\x00",4);
	}

	SendCommToBh10("\x1b\x76",2);
	if (bOKI==1)
	{
//		SendCommToBh10("\x1b\x49\xc0\x4c",4);
		SendCommToBh10("\x0d\x1b\x2d\x00",4);
	}
	bDoubleHigh=0;
	return 0;
}

int Bh10SetLineSpace(int LineSpace)//	设置行距
{
	gLineSpace=LineSpace/2;//gLineSpace为全局变量
	return 0;
}

int Bh10SetWordSpace(int WordSpace)//	设置字距
{
	switch(WordSpace)
	{
	case 10:
		SendCommToBh10("\x1b\x50",2);
		break;
	case 12:
		SendCommToBh10("\x1b\x4d",2);
		break;
	default:
		SendCommToBh10("\x1b\x67",2);
	}
	return 0;
}

int Bh10OutPut(char * szData, int iLen)
{
	int i,sLen;
	char PrnData[1024];

	memset(PrnData,0x00,sizeof(PrnData));
	for (i=0;i<iLen;i++)
	{
		switch(szData[i])
		{
		case '\x0c':
			if (strlen(PrnData)>0)
			{
				Bh10PrintData(PrnData,strlen(PrnData));
				memset(PrnData,0x00,sizeof(PrnData));
			}

			Bh10PaperOut();
			break;

		case '\x0a':
			if (strlen(PrnData)>0)
			{
				Bh10PrintData(PrnData,strlen(PrnData));
				memset(PrnData,0x00,sizeof(PrnData));
			}

			gCurrRow++;
			Bh10LineMove(0,1);

//			if (bDoubleHigh) gCurrRow++;
			break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -