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

📄 main.c

📁 利用POS机具硬件改为条纹码扫描器的编程代码
💻 C
📖 第 1 页 / 共 2 页
字号:

/**************************************
函数名称:	setup_first
函数功能:	第一次进行初始化全局变量
函数参数:	无
函数返回:	无
**************************************/
void setup_first(void)
{
    upload_flag='-' ;
    /*默认 上传标志为未上传*/
    print_flag=YES ;
    /*默认 刷卡后不立即进打印*/
    offline_flag=NO ;
    /*默认 联机交易,刷卡后数据立即上传*/
    strcpy(SET_OPER,"99");
    /*操作员:99,密码:000000*/
    strcpy(SET_PWD,"000000");
    /*可以在系统维护中修改*/
}
/**************************************
函数名称:	kq_setPassword
函数功能:	设置管理员密码
函数参数:	无
函数返回:	无
**************************************/
int kq_setPassword(void)
{
    int i ;
    char buffer[9],buffer1[9];
    
    memset(buffer,0,sizeof(buffer));
    memset(buffer1,0,sizeof(buffer1));
    
    cls();
    display(1,"请输新密码:");
    
    keyoff();
    do 
    {
        i=getnstr(2,buffer);
    }
    while((i!=0)&&(i!=6));
    keyon();
    
    cls();
    display(1,"请再输一次:");
    
    keyoff();
    do 
    {
        i=getnstr(2,buffer1);
    }
    while((i!=0)&&(i!=6));
    keyon();
    
    if(memcmp(buffer,buffer1,6)!=0)
    {
        cls();
        display_inv(1,"两次密码不一致");
        delay(1);
        return(FAIL);
    }
    if(i==6)
    {
        sprintf(SET_PWD,"%s",buffer);
    }
    cls();
    display_inv(1,"恭喜  恭喜");
    display_inv(2,"请牢记新密码");
    delay(1);
    return(SUCC);
}
/**************************************
函数名称:kq_dispNow
函数功能:显示当前日期与时间	
函数参数  无:	
函数返回:无	
**************************************/
void kq_dispNow(void)
{
    kq_getDateTime();
    display(3," 20%2.2s年%2.2s月%2.2s日",kq_date,kq_date+2,kq_date+4);
    display(4,"    %2.2s:%2.2s:%2.2s",kq_time,kq_time+2,kq_time+4);
}
/**************************************
函数名称:kq_getDateTime
函数功能:获取当前的日期和时间	
函数参数  无	
函数返回:kq_date,kq_time	
**************************************/
int kq_getDateTime(void)
{
    get_date(kq_date);
    get_time(kq_time);
    return(SUCC);
}

/**************************************
函数名称:	kq_displogo
函数功能:	显示启动介面及第一次进入维护
函数参数:	无
函数返回:      SUCC/FAIL	
**************************************/
int kq_displogo(void)
{
    int j,ret ;
    char i ;
    char buffer[9];
    
    cls();
    display_inv(1,"实达外设考勤");
    display_cen(2,"按清除键进入维护");
    display_cen(3,"2005/10/01");
    display_cen(4,"V0.5");
    
    /* 清除键的键为CANCEL */
    if(inkey(3)==CANCEL)
    {
        do 
        {
            cls();
            display(1,"1.交易模式");
            display(2,"2.时间设定");
            display(3,"3.数据上传");
            display(4,"4.打印流水");
            i=inkey(0);
            if(i=='1'||i=='2'||i=='3'||i=='4')break ;
            if(i==CANCEL)return(FAIL);
            if(i==ENTER)
            {
                cls();
                display(1,"5.重设管理员密码");
                display(2,"6.划卡后立即打印");
                display(3,"7.清除已上传数据");
                display(4,"8.从主机下载卡号");
            }
            i=inkey(0);
            if(i==CANCEL)return(FAIL);
            if(i=='5'||i=='6'||i=='7'||i=='8')break ;
        }
        while(1);
        
        /* 密码有三次机会 */
        j=1 ;
        memset(buffer,0,sizeof(buffer));
        while(j<=3)
        {
            cls();
            display(1,"请输密码(6位):");
            keyoff();
            ret=getnstr(2,buffer);
            keyon();
            if((ret==1)&&(buffer[0]==0xff))continue ;
            if(memcmp(buffer,SET_PWD,6)==0)break ;
            j++;
            display_inv(2,"密码错误");
            delay(1);
        }
        if(j>3)return(FAIL);
        else 
        {
            /* 身份确认成功,进行相应操作。 */
            switch(i)
            {
                case '1' :
                cls();
                if(offline_flag==YES)
                {
                    offline_flag=NO ;
                    display_inv(2,"开始联机交易");
                    display_inv(3,"立即上传数据");
                }
                else 
                {
                    offline_flag=YES ;
                    display_inv(2,"开始脱机交易");
                    display_inv(3,"暂不上传数据");
                }
                delay(2);
                break ;
                case '2' :
                /* 设定时间 */
                kq_setDateTime();
                break ;
                case '3' :
                /* 联机交易时,上传全部数据 */
                if(offline_flag==NO)
                {
                    kq_dataUpload_all();
                }
                else 
                {
                    cls();
                    display_inv(1,"实达外设考勤");
                    display_inv(3,"未联机不能上传");
                    delay(2);
                }
                break ;
                case '4' :
                /* 打印流水文件中的全部数据 */
                kq_dataPrint_all();
                break ;
                case '5' :
                /* 重设管理员密码 */
                kq_setPassword();
                break ;
                case '6' :
                /* 划卡后立即打印 */
                cls();
                if(print_flag==YES)
                {
                    print_flag=NO ;
                    display_inv(2,"刷卡后不立即打印");
                    display_inv(3,"可在维护时再打印");
                }
                else 
                {
                    print_flag=YES ;
                    display_inv(2,"刷卡后立即打印");
                    display_inv(3,"请先装好打印纸");
                }
                delay(2);
                break ;
                case '7' :
                /* 清空已上传数据 */
                kq_dataClear();
                break ;
                case '8' :
                /* 从主机下载 */
                kq_downCardno();
                break ;
                default :
                break ;
            }
            ;
        }
    }
    return SUCC ;
}

/**************************************
函数名称:	kq_dataClear()
函数功能:	清空已上传数据
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int kq_dataClear(void)
{
    char fd,ret ;
    int i ;
    struct KQ_REC kqRec ;
    
    fd=pfopen("water",'R');
    if(fd==0||fd=='E')
    {
        cls();
        display_inv(1,"实达外设考勤");
        display_cen(3,"流水文件无数据");
        delay(1);
        return(FAIL);
    }
    for(i=1;;i++)
    {
        ret=pfread(fd,i,1,(char*)&kqRec);
        if(ret==0)
        {
            display_clear(3);
            display_cen(3,"数据已经删完");
            systemsound(500);
            delay(1);
            break ;
        }
        if(kqRec.upload_flag=='+')
        if(pfdelrec(fd,i)==0)
        {
            display_clear(3);
            display_cen(3,"删除已上传记录");
            i--;
            /*由于是顺序文件,删除一个记录后,后续的记录号也会变更
                                    	  所以,要对记录号进行修正。*/
        }
    }
    return(SUCC);
}
/**************************************
函数名称:	kq_setDateTime
函数功能:	获取当前日期和时间
函数参数:	无
函数返回:	全局变量,kq_date,kq_time
**************************************/
int kq_setDateTime(void)
{
    char datestr[9],timestr[9];
    int ret=0 ;
    
    memset(datestr,0,sizeof(datestr));
    memset(timestr,0,sizeof(timestr));
    
    cls();
    display(1,"输入日期yymmdd:");
    ret=getnstr(2,datestr);
    if(!(ret==1&&datestr[0]==0xff))
    set_date(datestr);
    
    display(1,"输入时间hhmmss:");
    ret=getnstr(2,timestr);
    if(!(ret==1&&timestr[0]==0xff))
    set_time(timestr);
    return(SUCC);
}

/*********************************************
  函数名称:	display_inv
  函数功能:	在指定行中央反白显示指定字符串
  函数参数:	(int)lineno:	指定行
                (char *)lg:	指定字符串
  函数返回:	(int)SUCC
 **********************************************/
int display_inv(int lineno,char*str)
{
    set_inverse(1);
    display_cen(lineno,str);
    set_inverse(0);
    return(SUCC);
}

/*******************************************
  函数名称:	display_cen
  函数功能:	在指定行中央显示指定字符串
  函数参数:	(int)lineno:	指定行
                (char *)lg:	指定字符串
  函数返回:	(int)SUCC
 **********************************************/
int display_cen(int lineno,char*str)
{
    int j ;
    char buffer[20];
    
    memset(buffer,0,sizeof(buffer));
    
    if(strlen(str)>=16)
    {
        j=0 ;
    }
    else 
    {
        j=(16-strlen(str))/2 ;
    }
    
    if(j)
    {
        memset(buffer,' ',j);
        strcpy(buffer+j,str);
        display(lineno,buffer);
    }
    else 
    {
        display(lineno,str);
    }
    
    return(SUCC);
}
/*********************************************
  函数名称:	dispaly_clear
  函数功能:	清空屏幕某一行
  函数参数:	(int)lineno:	指定行数
  函数返回:	(int)SUCC
 **********************************************/
int display_clear(int lineno)
{
    display(lineno," ");
    return(SUCC);
}

/**************************************
函数名称:handshake_to_host	
函数功能:与后台握手
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int handshake_to_host(void)
{
    int failtime=0 ;
    char h_char ;
    
    /* 与主机进行握手, 5 次重试机会 */
    do 
    {
        h_char=0x05 ;
        /*
         * 发送 ENQ 0x05
         */
        sendrs232(1,&h_char);
        /*                      
         * 读 0x06,表示握手成功
         */
        if(kq_result()==SUCC)return(SUCC);
        /* 
         * 检测重试次数
         */
    }
    while(failtime++<=5);
    return(FAIL);
}

/**************************************
函数名称:send_to_host	
函数功能:发送到后台	
函数参数:	
         pack_len:包长
         pack_str:数据包
函数返回:	SUCC/FAIL
**************************************/
int send_to_host(int pack_len,char*pack_str)

{
    int p_len ;
    char buffer[31];
    /* 数据包的结构 STX + LENGTH + DATA + ETX ,buffer(1)(2)以8421码表示数据的长度 */
    memset(buffer,0,sizeof(buffer));
    p_len=pack_len ;
    /*
     * 添加 STX 0x02
     */
    buffer[0]=0x02 ;
    /*
     * 计算长度 (8421)
     */
    buffer[1]=(p_len/100)+(p_len/100)/10*6 ;
    buffer[2]=(p_len%100)+(p_len%100)/10*6 ;
    
    memcpy(buffer+3,pack_str,pack_len);
    /*
     * 添加 ETX 0x03
     */
    buffer[1+2+pack_len]=0x03 ;
    /*
     * 计算LRC,一个字节,附加在最后
     
    		for ( lrc = 0 , i = 1 ; i <= 2 + pack_len+1 ; i ++ )
    			lrc ^= buffer [ i ] ;
    		buffer [ 1 + 2  + pack_len + 1 ] = lrc ;
    */
    sendrs232(1+2+pack_len+1,buffer);
    
    return(SUCC);
}
/**************************************
函数名称:read_from_host	
函数功能:从后台读数据
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int read_from_host()
{
    
    int failtime,len ;
    char h_char ;
         
            char    buffer[2];
//            int     ret;
    /* readstr 不包括 STX 0x02 , ETX 0x03  */
    
    /* 读取 STX 0x02 直到超时 */
    failtime=0 ;
    
    do 
    {
        readrs232(&h_char,1,1);
        if(h_char==0x02)break ;
        
    }
    while(failtime++<10);
    
    if(failtime>=10)
    {
        display_clear(4);
        display_cen(4,"接收STX超时");
        delay(1);
        return(FAIL);
    }
    
    /* 计算长度 */
            
            readrs232( buffer, 3 ,2  ) ;
    	
    	readlen  = ( buffer [ 0 ] >> 4 ) * 1000 + ( buffer [ 0 ] & 0x0f )
    		    * 100 + ( buffer [ 1 ] >> 4 ) * 10 + ( buffer [ 1 ] & 0x0f ) ;
 
 //   readlen=18 ;
    
    /* STX+C********N******V*+ETX
     * 包括 ETX 0x03 ,所以数据总长度要加2,10秒内读完
     */
    len=readrs232(readstr,3,readlen+1);
    
    /* readlen=有效数据的长度,1=ETX */
    
    if(len!=readlen+1)
    {
        display_clear(4);
        display_inv(4,"数据长度错");
        delay(1);
        return(FAIL);
    }
    
    /* 检查 0x03 */
    if(readstr[readlen]!=0x03)
    {
        display_clear(4);
        display_inv(4,"数据包结束错");
        delay(1);
        return(FAIL);
    }
    
    /* buffer[0],buffer[1],现在放的是长度
               检查LRC 校验时,是带着长度一起算的
    	lrc = 0 ;
    	lrc ^= buffer [ 0 ] ;
    	lrc ^= buffer [ 1 ] ;
    	for ( i = 0 ; i < readlen + 1 ; i ++ )
    		lrc ^= buf [ i ] ;
    
    		if ( buf [ readlen + 1 ] != lrc ) {
    			display_clear(4);
    			display ( 4 , "LRC校验错" ) ;
    			delay ( 2 ) ;
    			return ( FAIL ) ;
    		}
    */
    /* 置为'\0',作为串结束符 */
    
    readstr[readlen]=0x0 ;
    return(SUCC);
}
/*************************************
函数名字: KQ_RESULT
函数功能:读入返回码
函数返回:SUCC,FAIL
函数参数: VOID
*************************************/
int kq_result(void)
{
    char result ;
    int ret,failtime=0 ;
    
    /* 返回结果的格式  ACK  */
    do 
    {
        ret=readrs232(&result,1,1);
        if(ret==1)
        if(result==0x06)return(SUCC);
    }
    while(failtime++<2);
    return(FAIL);
}

⌨️ 快捷键说明

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