bh10.cpp

来自「vt100终端仿真程序」· C++ 代码 · 共 1,358 行 · 第 1/2 页

CPP
1,358
字号
		case '\x0d'://处理倍高时的"\x0d",否则报1020错误

			if (strlen(PrnData)>0)
			{
				Bh10PrintData(PrnData,strlen(PrnData));
				memset(PrnData,0x00,sizeof(PrnData));
			}

			if (bDoubleHigh)
			{
				if (strlen(PrnData)>0)
				{
					Bh10PrintData(PrnData,strlen(PrnData));
					memset(PrnData,0x00,sizeof(PrnData));
				}
				
				SendCommToBh10("\x0d\x1b\x2d\x00",4);
			}
			else
				SendCommToBh10("\x0d",1);

//			gCurrCol=1;
			break;
		

		default:
			if (szData[i]!='\x7f')
				PrnData[strlen(PrnData)]=szData[i];
			break;

		}
	}
	
	sLen=strlen(PrnData);
	if (sLen>0)
	{
		Bh10PrintData(PrnData,sLen);
		memset(PrnData,0x00,sizeof(PrnData));
	}

	return 0;
	
}

int SendCommToBh101(char * szDataBuf, int DataLen)
{
	char ReceBuf[128];
	char DataBuf[1024];
	char SendBuf[1024];
	short int iLen=0;
	int SendLen=0;
	DWORD iBytes;

	if (DataLen==0) return 0;
	
	if (strchr(szDataBuf,0x0d)!=NULL)
		gCurrCol=0;

	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;

	memcpy(DataBuf+iLen,"\x8e\xa1",2);
	
	iLen+=2;

	memcpy(DataBuf+iLen,szDataBuf,DataLen);
	iLen+=DataLen;
	
	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 Bh10SetDoubleWidth()
{
	SendCommToBh10("\x1b\x77",2);
	bDoubleWidth=1;
	return 0;
}


int Bh10SetNormalWidth()
{
	SendCommToBh10("\x1b\x76",2);
	bDoubleWidth=0;
	return 0;
}

int Bh10PrintData(char * szDataBuf,	int DataLen)//输出字符
{

   	
	memset(Bh10Buf[Bh10BufLen].DataBuf,0x00,BUFFERLEN);
	memcpy(Bh10Buf[Bh10BufLen].DataBuf,szDataBuf,DataLen);

	Bh10Buf[Bh10BufLen].DataLen=DataLen;
	Bh10Buf[Bh10BufLen].DataType=1;
	Bh10Buf[Bh10BufLen].iDoubleHigh =bDoubleHigh;

	Bh10BufLen++;

	return 0;
}


int SendCommToBh10(char * szDataBuf, int DataLen)
{
	memset(Bh10Buf[Bh10BufLen].DataBuf,0x00,BUFFERLEN);
	memcpy(Bh10Buf[Bh10BufLen].DataBuf,szDataBuf,DataLen);

	Bh10Buf[Bh10BufLen].DataLen=DataLen;
	Bh10Buf[Bh10BufLen].DataType=0;
	Bh10Buf[Bh10BufLen].iDoubleHigh =bDoubleHigh;

	Bh10BufLen++;

	return 0;
}

int Bh10PrintFont15(char * szDataBuf,	int DataLen, int iDoubleHigh)
{
	int i;
	int CharType;
	char OutPutBuf[128];//输出缓冲区
	char ChineseBuf[256];//汉字缓冲区
	char AsciiBuf[256];//英文缓冲区
	int ChineseLen=0;
	int AsciiLen=0;
//	int Pstart,Pend;//打印起始位置,结束位置

	int bHz=0;

	if (DataLen==0) return 0;

	memset(OutPutBuf,0x00,sizeof(OutPutBuf));
	memset(ChineseBuf,0x00,sizeof(ChineseBuf));
	memset(AsciiBuf,0x00,sizeof(AsciiBuf));
	
	if ((unsigned char)szDataBuf[0]>=128)
	{   
		bHz=1;
		CharType=1;
	}
	else
	{
		CharType=0;
		bHz=0;
	}
	OutPutBuf[0]=szDataBuf[0];

	for (i=1;i<DataLen;i++)
	{
		if ((unsigned char)szDataBuf[i]>=128 && CharType==0)
		{
			//输出缓冲区中的英文字符
			strcat(AsciiBuf,OutPutBuf);
			AsciiLen=strlen(AsciiBuf);
			ChineseLen=strlen(ChineseBuf);
			if (bDoubleWidth==0)
				AsciiLen=AsciiLen*13/15;
			else
				AsciiLen=AsciiLen*13/30;
			if (AsciiLen%2) 
//			{
				AsciiLen++;
//				strcat(AsciiBuf," ");
//			}
			memset(ChineseBuf+ChineseLen,0xa1,AsciiLen-ChineseLen);
			
//			Bh10PrintE(OutPutBuf,strlen(OutPutBuf),iDoubleHigh);
			
			//状态变换
			memset(OutPutBuf,0x00,sizeof(OutPutBuf));
			CharType=1;
			bHz=1;
			OutPutBuf[strlen(OutPutBuf)]=szDataBuf[i];
		}
		else
		{
			if ((unsigned char)szDataBuf[i]<128 && CharType==1 && bHz==0)
			{
				//输出缓冲区中的汉字
				strcat(ChineseBuf,OutPutBuf);
				AsciiLen=strlen(AsciiBuf);
				ChineseLen=strlen(ChineseBuf);
				if (bDoubleWidth==0)
					ChineseLen=(ChineseLen*15+7)/13+1;
				else
					ChineseLen=(ChineseLen*30+7)/13+1;
				memset(AsciiBuf+AsciiLen,0x20,ChineseLen-AsciiLen);
//				Bh10PrintC(OutPutBuf,strlen(OutPutBuf),iDoubleHigh);

				//状态变换
				memset(OutPutBuf,0x00,sizeof(OutPutBuf));
				CharType=0;
				OutPutBuf[strlen(OutPutBuf)]=szDataBuf[i];

			}
			else
			{
				OutPutBuf[strlen(OutPutBuf)]=szDataBuf[i];
				if (bHz==1)
					bHz=0;
				else
				{
					if ((unsigned char)szDataBuf[i]>=128)
						bHz=1;
				}
			}

		}
	}

	if (CharType==0)
//		输出缓冲区中的英文字符
//		Bh10PrintE(OutPutBuf,strlen(OutPutBuf),iDoubleHigh);
		strcat(AsciiBuf,OutPutBuf);
	else
//		输出缓冲区中的汉字
//		Bh10PrintC(OutPutBuf,strlen(OutPutBuf),iDoubleHigh);
		strcat(ChineseBuf,OutPutBuf);



		Bh10PrintE(AsciiBuf,strlen(AsciiBuf),iDoubleHigh);
		Bh10PrintC(ChineseBuf,strlen(ChineseBuf),iDoubleHigh);

	if (strchr(szDataBuf,0x0d)==NULL)
	{
		if (CharType==0)
		{
			if (bDoubleWidth==0)
				gCurrCol+=strlen(AsciiBuf);
			else
				gCurrCol+=strlen(AsciiBuf)*2;
		}
		else
		{
			if (bDoubleWidth==0)
				gCurrCol+=(strlen(ChineseBuf)*15+7)/13+1;
			else
				gCurrCol+=(strlen(ChineseBuf)*30+7)/13+1;
		}
	}
	else
		gCurrCol=0;

	return 0;
}

int Bh10PrintC(char * szDataBuf, int DataLen,int iDoubleHigh)
{
	int iSpace;
	char szBuf[128];
	int iLen;

	if (DataLen==0) return 0;

	memset(szBuf,0x00,sizeof(szBuf));

	if (gCurrCol!=0 && iChangeCode==0)
	{
//		iSpace=gCurrCol*13/15;
		if (bDoubleWidth==0)
			iSpace=gCurrCol*13/15;
		else
			iSpace=gCurrCol*13/30;

		if (iSpace%2) iSpace=iSpace+1;
		memset(szBuf,0xa1,iSpace);
	}
	else
		iSpace=0;
	memcpy(szBuf+iSpace,szDataBuf,DataLen);
	iLen=DataLen+iSpace;


	SendDataToBh10("\x0d\x1b\x2d\x00",4,0);
	if (iDoubleHigh==1)
		SendDataToBh10("\x1b\x49\xc0\x50",4,0);
	SendDataToBh10("\x1b\x66",2,0);
//	SendDataToBh10(szBuf,iLen,1);
	PrintGbk(szBuf,iLen);

	SendDataToBh10("\x0d\x1b\x2d\x00",4,0);
//	if (iDoubleHigh==1)
//		SendDataToBh10("\x1b\x49\xc0\x50",4,0);
	SendDataToBh10("\x1b\x67",2,0);

//	gCurrCol=(int)((float)(iLen*15)/(float)13+0.7);
//	gCurrCol=iLen*15/13+1;
//	if (bDoubleWidth==0)
//		gCurrCol=(iLen*15+7)/13+1;
//	else
//		gCurrCol=(iLen*30+7)/13+1;
	iChangeCode=1;

	return 0;	
}

int Bh10PrintE(char * szDataBuf, int DataLen, int iDoubleHigh)
{
	int iSpace;
	char szBuf[128];
	int iLen;
	int i,j;
	
	memset(szBuf,0x00,sizeof(szBuf));

	j=0;
	for (i=0;i<DataLen;i++)
	{
		if (szDataBuf[i]!=0x20)
		{
			j=1;
			break;
		}

	}

	if (j==1 || iChangeCode==0)
	{
		if (gCurrCol!=0 && iChangeCode==1)
		{
			if (iDoubleHigh==1)
				SendDataToBh10("\x1b\x49\xc0\x50",4,0);
//			iSpace=gCurrCol;
			if (bDoubleWidth==0)
				iSpace=gCurrCol;
			else
				iSpace=(gCurrCol+1)/2;

			memset(szBuf,0x20,iSpace);
		}
		else
			iSpace=0;

		memcpy(szBuf+iSpace,szDataBuf,DataLen);
		iLen=DataLen+iSpace;

		SendDataToBh10(szBuf,iLen,0);
	}

//	if (strchr(szBuf,0x0d)==NULL)
//	{
//		if (bDoubleWidth==0)
//			gCurrCol+=DataLen;
//		else
//			gCurrCol+=DataLen*2;
//	}
//	else
//		gCurrCol=0;

	iChangeCode=0;

	return 0;	
}

int SendDataToBh10(char * szDataBuf, int DataLen, int CharType)
{

	char ReceBuf[128];
	char DataBuf[1024];
	char SendBuf[1024];
	short int iLen=0;
	int SendLen=0;
	int i;
	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);
		}
	}



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

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

	if (CharType==0)
		memcpy(DataBuf+iLen,"\x8e\xa1",2);
	else
	{
		memcpy(DataBuf+iLen,"\x8e\xa2",2);
		for (i=0;i<DataLen;i++)
			szDataBuf[i]=(unsigned char)szDataBuf[i] - 128;
	}
	
	iLen+=2;

	memcpy(DataBuf+iLen,szDataBuf,DataLen);
	iLen+=DataLen;
	
	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 PowerOn()
{
	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);
		}
		else
		{

//			if (ReceBuf[0]==0x00)
//				MessageBox(NULL,"打印机加电或未联结,请检查!","提示",MB_OK);
//			if (ReceBuf[0]==0x15)
//				MessageBox(NULL,"打印机状态错误,请检查!","提示",MB_OK);
			if (ReceBuf[0]==0x15)
				return 1;
		}
	}
	return 0;
}

////////////////////////////////////////////////////
//进纸
int PaperIn()
{
	char ReceBuf[128];
	DWORD iBytes;

	csAuxCom.SendData("\02\x05\x00\x30\x8e\xa1\x1b\x73\x03\xf5",10);

	memset(ReceBuf,0x00,sizeof(ReceBuf));

	csAuxCom.RcvData(ReceBuf,&iBytes);

	while(memcmp(ReceBuf,"\x02\x01\x00\x30\x03\x34",6)!=0)
	{
		csAuxCom.SendData("\x05",1);
		memset(ReceBuf,0x00,sizeof(ReceBuf));
		csAuxCom.RcvData(ReceBuf,&iBytes);
		if (iBytes==1 && ReceBuf[0]==0x15)
			return 1;
	}
	csAuxCom.SendData("\x06",1);

	gCurrCol=0;
	iChangeCode=0;

	return 0;
}

////////////////////////////////////////////////////
//打印
int PrintBuf()
{
	int i;
	int iRet;

	for (i=0;i<Bh10BufLen;i++)
	{
		if (Bh10Buf[i].DataType )
			iRet=Bh10PrintData1(Bh10Buf[i].DataBuf,Bh10Buf[i].DataLen, Bh10Buf[i].iDoubleHigh );
		else
			iRet=SendCommToBh101(Bh10Buf[i].DataBuf,Bh10Buf[i].DataLen );
		if (iRet==1) return 1;
	}

	return 0;
}

////////////////////////////////////////////////////
//退纸
int PaperOut()
{
	char ReceBuf[128];
	DWORD iBytes;

	csAuxCom.SendData("\x02\x05\x00\x30\x8e\xa1\x1b\x75\x03\xf7",10);

	memset(ReceBuf,0x00,sizeof(ReceBuf));

	csAuxCom.RcvData(ReceBuf,&iBytes);

	while(memcmp(ReceBuf,"\x02\x01\x00\x30\x03\x34",6)!=0)
	{
		if (iBytes==1 && ReceBuf[0]==0x15)
			return 1;
		csAuxCom.SendData("\x05",1);
		memset(ReceBuf,0x00,sizeof(ReceBuf));
		csAuxCom.RcvData(ReceBuf,&iBytes);
	}

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

	bPaperIn=0;
	iStartPrint=0;
	
	gCurrCol=0;

	return 0;
}

////////////////////////////////////////////////////
//BH10打印缓冲区内容
int Bh10Print()
{
	int iRet;
	

	iRet=PowerOn();
	if (iRet==1) return 1;

	iRet=PaperIn();
	if (iRet==1) return 2;

	iRet=PrintBuf();
	if (iRet==1) return 3;

	iRet=PaperOut();
	if (iRet==1) return 4;

	return 0;
}


//////////////////////////////////////////////////////////////////
//打印汉字
int PrintGbk(char * szDataBuf, int DataLen)
{
	char HzBuf[256];
	int i,j;
	int len;
	char Zkdz[100];
	int lByte,hByte;
	HANDLE hFile;
	int WordSite;
	long FileOff;
	DWORD Bytes;

//	char str1[200];

	memset(HzBuf,0x00,sizeof(HzBuf));

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

	if (hFile==INVALID_HANDLE_VALUE)
		return 0;

	len=DataLen/2;
	j=0;

	for (i=0;i<len;i++)
	{
		if ((unsigned char)szDataBuf[2*i]>160 && (unsigned char)szDataBuf[2*i+1]>160)
		{
			HzBuf[j++]=szDataBuf[2*i];
			HzBuf[j++]=szDataBuf[2*i+1];
		}
		else
		{
			SendDataToBh10(HzBuf,strlen(HzBuf),1);
			memset (HzBuf,0x00,sizeof(HzBuf));

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

//			sprintf(str1,"hByte is:%x ,lByte is %x",szDataBuf[2*i],szDataBuf[2*i+1]);
//			MessageBox(NULL,str1,"aaa",MB_OK);

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

//			sprintf(str1,"hByte is:%d ,lByte is %d",hByte,lByte);
//			MessageBox(NULL,str1,"aaa",MB_OK);

			FileOff=WordSite*72;
			SetFilePointer(hFile,FileOff,NULL,FILE_BEGIN);
			ReadFile(hFile,Zkdz+2,72,&Bytes,NULL);
			SendDataToBh10(Zkdz,74,0);
		}
	}
	if (strlen(HzBuf)>0)
		SendDataToBh10(HzBuf,strlen(HzBuf),1);

	CloseHandle(hFile);

	return 0;
}

⌨️ 快捷键说明

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