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 + -
显示快捷键?