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

📄 pr2driver.c

📁 hid类主机对打印机操作的应用例程
💻 C
📖 第 1 页 / 共 5 页
字号:
								  PR2DRIVER(Close));
	return 0;
}




//xxxxxxxx
int PR2DRIVER(ReadComm)(char* result,int length)
{
	jbyteArray jbValue        ;
	jbyte      *abyteTmp      ;
	jboolean   iscopy      = 1;
	char       value     [1  ];
	int        i              ;
	int        ret            ;
	jintArray  tmpLen=(*PR2DRIVER(nat_env))->NewIntArray(PR2DRIVER(nat_env),1);


	if(length<1)
		return 0;

	jbValue      =(*PR2DRIVER(nat_env))->NewByteArray(PR2DRIVER(nat_env),1);
	(*PR2DRIVER(nat_env))->SetByteArrayRegion(PR2DRIVER(nat_env),jbValue,0,1, (jbyte *)value);

	i = 0;
	while (1) {
		#ifdef _DEBUG_PR2DRIVER
			PR2DRIVER(print)("read key!",0);
		#endif	

		ret = (*PR2DRIVER(nat_env))->CallIntMethod(PR2DRIVER(nat_env),
										PR2DRIVER(nat_obj),
										PR2DRIVER(Read),
										(jbyte)PR2DRIVER(bPortValue),
										jbValue,
										tmpLen,
										PR2DRIVER(iIoTimeout),
										PR2DRIVER(printFlag));  //(B[BII)I
		if(ret<0)
		{
			return ret;
		}

		abyteTmp = (*PR2DRIVER(nat_env))->GetByteArrayElements(PR2DRIVER(nat_env),jbValue,&iscopy);
		value[0]= *abyteTmp;
		printf("value[0] is %c\n",value[0]);
		(*PR2DRIVER(nat_env))->ReleaseByteArrayElements(PR2DRIVER(nat_env),jbValue,abyteTmp,0);
		result[i] = value[0];
		#ifdef _DEBUG_PR2DRIVER
			PR2DRIVER(print)("read char i=",i);
		#endif	
		i++;
		if(i==length)
		return length;
	}
	return 0;
}
//
//zzzzz
int PR2DRIVER(WriteComm)(const char* data, int length)
{
	jbyteArray jbHintMesg     ;	
	int ret;
	#ifdef _DEBUG_PR2DRIVER
		char filename[256];
		FILE * flog;
	#endif	
	
	if(length<=0)
		return 0;

#ifdef _DEBUG_PR2DRIVER
	{
		FILE *tt = fopen("aa.dat", "a+");
		static si = 0;
		int ii;
		if (tt != NULL) {
			//fprintf(tt, "\n");
			for (ii = 0; ii<length; ii++,si++) {
				fprintf(tt,  "%02X ",  data[ii]&0xff);
				if (((si+1) % 16) == 0) fprintf(tt, "%s", "\n");
			}
			fclose(tt);
		}
	}
#endif

	jbHintMesg   =(*PR2DRIVER(nat_env))->NewByteArray(PR2DRIVER(nat_env),length);
	(*PR2DRIVER(nat_env))->SetByteArrayRegion(PR2DRIVER(nat_env), jbHintMesg  , 0,length, (jbyte *)data);


	#ifdef _DEBUG_PR2DRIVER
		PR2DRIVER(print)("input hint message",0);
	#endif
			

	ret= (*PR2DRIVER(nat_env))->CallIntMethod(PR2DRIVER(nat_env),
		   					       PR2DRIVER(nat_obj),
							       PR2DRIVER(Write),
							       (jbyte)PR2DRIVER(bPortValue),
							       jbHintMesg,
							       length,
								   PR2DRIVER(printFlag));//input password message
	return ret;
}





/*******************************************************************
检测打印机状态发送 _PR2DRIVER_ESC j ,从打印机返回状态
函数返回值:0   状态正常,
			-1 状态不正常,但是打印机有返回值,
			-2 打印机无返回值
            vt-pr2打印机永远状态正确,且纸张已经放好。
*******************************************************************/
int PR2DRIVER(checkPrtAnswerState)()
{
	/* 普通打印机 */
	char retbuf[4];
	int  i        ;
	int  ret      ;

	PR2DRIVER(WriteComm)(PR2DRIVER(StateAsk),strlen(PR2DRIVER(StateAsk)));
	memset(retbuf,0x00,4);
	for(i=0;i<3;)
	{
		ret = PR2DRIVER(ReadComm)(retbuf+i,1);
		if(ret<0)
			return ret;
		if(retbuf[0]==0x1b) 
			i++;
		if(retbuf[i] <0)
			break;
	}
	printf("retbuf is %s\n",retbuf);

	retbuf[i]=0;
	if (!strcmp(retbuf,PR2DRIVER(StateOk)))	
		return 0;//ok
	else if( retbuf[0]!=PR2DRIVER(StateOk)[0]||retbuf[1]!=PR2DRIVER(StateOk)[1])
	{
		return -2;
	}
	else if ((retbuf[0]==PR2DRIVER(StateOk)[0] && retbuf[1]==PR2DRIVER(StateOk)[1]) && (retbuf[2]&0x08 || retbuf[2]&0x01))
	{//纸的尾行首列
		return -3;
	}
	return -1;
}

//add by zhanghui 2005.5.11
/***************************
检测读写磁条时打印机状态
发送 ESC j ,从打印机返回状态
函数返回值:0 进纸成功, -1状态不正常,但是打印机有返回值,-2 打印机无返回值
***************/
int PR2DRIVER(checkMagAnswerState)()
{
	char retbuf[4];
	int i;
	int ret;
	
	PR2DRIVER(WriteComm)(PR2DRIVER(StateAsk),strlen(PR2DRIVER(StateAsk)));
	memset(retbuf,0x00,4);	
	for(i=0;i<3;)
	{
		ret = PR2DRIVER(ReadComm)(retbuf+i,1);
		if(ret<0)
			return -1;
		if(retbuf[0]==0x1b)
			i++;
		if(retbuf[i] <0)
			break;
	}
	retbuf[i]=0;
	if(!strcmp(retbuf,PR2DRIVER(StateOk)) || !strcmp(retbuf,PR2DRIVER(MagOk)))	
		return 0;
	else if( retbuf[0]!=PR2DRIVER(StateOk[0])||retbuf[1]!=PR2DRIVER(StateOk[1])) 
	{
		return -2;
	}
	else 
	{
		return -1;
	}
}

/******************************************************************
 * 检查是否连接了一个pr2打印机
 * 返回值:打印机类型,pr2返回0, 
 *        其它非pr2打印机返回-1
 *        串口错误返回<-110的错误
 *
 ******************************************************************/
int PR2DRIVER(vTPrtStateCheck)() {
	char retbuf[10];
	int i;
	int charlen;
	int ret    ;
	jboolean   iscopy      = 1;
	char       hintMesg  [256];


	#ifdef _DEBUG_PR2DRIVER
		PR2DRIVER(print)("input hint message",0);
	#endif
	
	memset(hintMesg,0,256);
	sprintf(hintMesg,"%s","\x1bZ\x00");

	PR2DRIVER(WriteComm)(hintMesg,strlen(hintMesg));
	#ifdef _DEBUG_PR2DRIVER
		PR2DRIVER(print)("input hint message finished!",0);
	#endif

	memset(retbuf, 0x00, sizeof(retbuf));
	i = 0;
	
	while (TRUE)
	{
		ret=PR2DRIVER(ReadComm)(retbuf+i,1);
		if(ret<0)
		{
			PR2DRIVER(CloseComm)();
			return ret;
		}

		if (retbuf[0]=='<')
		{
			charlen = 5;
		} else if(retbuf[0]==0x1b)
		{
			charlen = 3;
		} else
		{
			continue;
		}
		i++;
		if (i>=charlen) break;
	}

	if(!strncmp(retbuf,"\x1b/7",3)) {
		return 0;
	}else if(!strncmp(retbuf,"\x1b//",3)){
		return 0;    //this type is pr40+ or pr50+;
	}else 
	{   
		PR2DRIVER(CloseComm)();
		return -1;
	}
}


/******************************************************************************
   这里处理大字符集的中文与GB2312中文的数据,对于不支持GBK打印的打印机,把GBK
   中非GB2312字符集的中文转换为0xA3 0xBF,即*输出对于支持GBK的打印机则直接输出
*******************************************************************************/

void PR2DRIVER(processGBdata)(char *databuf)
{
	if (!strcmp(_PR2DRIVER_CHARSET, "GBK")) {
		int i;
		char *p;
		unsigned short ss1, ss2;
		int len = strlen(databuf);

		if (len == 0) return;
		for (i=0, p=databuf; i<len; ) {
			ss1 = (unsigned short)(*p) & 0x00FF;
			/* a part of GBK 1.0 chinese */
			if (ss1 >= (unsigned short)0x00a1 && ss1 < (unsigned short)0x00FF) {
				if (i < len - 1) {
					ss2 = (unsigned short)(*(p+1)) & 0x00FF;
					if ( ss2 >= (unsigned short)0x0040 && ss2 < (unsigned short)0x00a1 && ss2 != (unsigned short)0x007f ) {
						*p = (char)0xa3; 
						*(p+1) = (char)0xaa;
						i += 2; p += 2;
					} else if ( ss2 >= (unsigned short)0x00a1 && ss2 < (unsigned short)0x00FF) {
						i += 2; p += 2;
					} else {
						*p = 0x20;
						i += 1; p += 1;
					}
				} else {
					*p = 0x20;
					i += 1; p += 1;
				}
			/* another part of GBK 1.0 chinese */
			} else if (ss1 > (unsigned short)0x0080 && ss1 < (unsigned short)0x00a1) {
				if (i < len - 1) {
					ss2 = (unsigned short)(*(p+1)) & 0x00FF;
					if ( ss2 >= (unsigned short)0x40 && ss2 < (unsigned short)0x00ff && ss2 != (unsigned short)0x007f ) {
					

⌨️ 快捷键说明

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