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

📄 main.c

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

void main()
{
    char ret ;
    int i ;
    
    /* 程序首次下装 进行相关初始化 */
    if(getproflag()==NO) 
    {
        pfinit(sizeof(struct KQ_REC)+2);
        setup_first();
        first_flag=NO ;
        systemsound(500);
    }
    
    /* 按键以正常键码 */
    keyon();
    
    /* 亮背光15秒 
    cdlight_manage ( 15 ) ;
    */
    enable_lcd_light();
    
    init_rs232(4,'N',8,1);
    
    /* 清除流水文件中已上传的记录,以腾出空间 */
    kq_dataClear();
    
    /* 进行系统维护,保证有足够的空间 */
    do 
    {
        kq_displogo();
        //检查内存空间是否足够,当记录数少于20条时,强行进入维护
        if(pfreerec()<=MIN_REC_NUM)
        {
            cls();
            display_inv(1,"====警告====");
            display(2,"可用内存不足");
            display(3,"请先上传数据");
            display(4,"按任意键继续");
            inkey(0);
        }
        else break ;
    }
    while(1);
    
    /* 检查打印机状态 */
    if(print_flag==YES)
    while(get_printer_status())
    {
        cls();
        display_inv(1,"====警告====");
        display(3,"请安装好打印纸");
        systemsound(500);
        if(get_printer_status()==1)
        semiautoloadpaper();
        if(inkey(3)==CANCEL)
        break ;
    }
    /* POS与主机握手   */
    cls();
    display_inv(1,"实达外设考勤");
    display_cen(3,"正在与主机握手");
    if(handshake_to_host()==FAIL)
    {
        offline_flag=YES ;
        display_clear(4);
        display_cen(4,"与主机握手失败");
        systemsound(500);
        delay(1);
    }
    else 
    {
        display_clear(4);
        display_cen(4,"与主机握手成功");
        delay(1);
    }
    
    /* 开始采集数据 */
    memset(track2,0,sizeof(track2));
    memset(track3,0,sizeof(track3));
    do 
    {
        cls();
        display_inv(1,"实达外设考勤");
        display_cen(2,"按任意键刷卡->");
        do 
        {
            kq_dispNow();
        }
        while(!kbhit());
        if(inkey(1)==CANCEL)
        {
            kq_displogo();
            continue ;
        }
        display_clear(3);
        display_clear(4);
        ret=recard(track2,track3,0);
        
        /* 有读到卡号,只用2道数据。*/
        if(ret!=0||track2[0]==0xff)
        {
            display_cen(3,"读卡出错");
            display_cen(4,"按任意键继续");
            delay(1);
            continue ;
        }
        
        /*判卡号长是否为8*/
        i=0 ;
        while(track2[i+1]!='\0')i++;
        if(i<8)
        {
            display_cen(3,"读卡出错");
            display_cen(4,"按任意键继续");
            inkey(2);
            continue ;
        }
        
        /* 只取前8位 */
        i=0 ;
        if(track2[i]<'0'||track2[i]>'9')
        while(i<8)
        {
            track2[i]=track2[i+1];
            i++;
        }
        track2[i]='\0' ;
        
        /* 在本机存放的卡号文件card中查找,以确认是不是合法记录 */
        if(kq_searchCardno(track2)!=SUCC)continue ;
        
        /* 获取当前的日期和时间 */
        kq_getDateTime();
        /* 在第三行显示卡号 */
        display_clear(3);
        display_cen(3,track2);
        
        /* 往后台送本次刷卡记录,offline_flag=NO,即是联机交易 */
        upload_flag='-' ;
        if(offline_flag==NO)
        {
            display_clear(4);
            if(kq_dataUpload_now()==SUCC)
            {
                display_cen(4,"上送成功");
                upload_flag='+' ;
            }
            else 
            {
                display_cen(4,"上送失败");
            }
            delay(1);
        }
        
        /*print_flag=YES, 立即打印出本次刷卡记录*/
        if(print_flag==YES)
        {
            display_clear(4);
            if(kq_dataPrint_now()==SUCC)
            display_cen(4,"打印成功");
            else 
            {
                display_cen(4,"打印失败");
            }
            delay(1);
        }
        display_clear(4);
        if(kq_dataSave()==SUCC)
        {
            display_cen(4,"保存成功");
        }
        else 
        {
            display_cen(4,"保存失败");
        }
        delay(1);
    }
    while(1);
}
/**************************************
函数名称:kq_searchCardno
函数功能:下载卡号文件	
函数参数:	char * card_no
函数返回:	SUCC/FAIL
**************************************/
int kq_searchCardno(char*card_no)
{
    char fd ;
    int i,ret ;
    struct KQ_REC cardRec ;
    
    /*打开卡号文件*/
    fd=pfopen("card",'R');
    if(fd==0||fd=='E')
    {
        return(FAIL);
    }
    for(i=1;;i++)
    {
        ret=pfread(fd,i,1,(char*)&cardRec);
        if(ret==0)
        {
            break ;
        }
        if(memcmp(cardRec.card_no,card_no,8)==0)return(SUCC);
    }
    return(FAIL);
}
/**************************************
函数名称:kq_downCardno	
函数功能:下载卡号文件	
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int kq_downCardno(void)
{
    char fd ;
    struct CARD_REC cardRec ;
    int i,ret ;
    char buffer[21];
    char h_char ;
    
    cls();
    display_inv(1,"实达外设考勤");
    display_cen(2,"card");
    display_cen(3,"正在接收数据");
    
    /* 与主机握手 */
    if(handshake_to_host()==FAIL)
    {
        display_clear(4);
        display_cen(4,"握手失败");
        delay(1);
        return(FAIL);
    }
    
    fd=pfopen("card",'W');
    if(fd==0)
    {
        display_clear(4);
        display_cen(4,"打开card失败");
        delay(1);
        return(FAIL);
    }
    
    /* 清除原来的所有记录 */
    for(i=1;;i++)
    {
        ret=pfdelrec(fd,i);
        if(ret==0)
        {
            i--;
        }
        else 
        {
            display_clear(4);
            display_cen(4,"原记录删除完");
            delay(1);
            break ;
        }
    }
    
    memset(buffer,0,sizeof(buffer));
    
    do 
    {
        display_clear(4);
        display_cen(4,"............");
        /*	     
        	    if ( read_from_host( ) == FAIL ) {
        	    	display_clear( 4 );
        	    	display_cen  ( 4 , "接收记录错" );
        	    	delay ( 1 );
        	    	return ( FAIL );
        	    }
        */
        /* =============调试时打印 =============*/
        strcpy(buffer,"");
        ret=readrs232(buffer,5,20);
        buffer[21]=0x0 ;
        feed_printer(1);
        printer("@ %d-%s-",ret,buffer);
        delay(1);
        
        h_char=0x06 ;
        sendrs232(1,&h_char);
        /* =============调试时打印 =============*/
        
        if(memcmp(readstr,"999999999999999999",readlen)==0||ret==0)
        {
            display_clear(4);
            display_cen(4,"接收完毕");
            delay(2);
            return(SUCC);
        }
        
        for(i=0;i<8;i++)
        cardRec.card_no[i]=readstr[i];
        
        for(i=10;i<6;i++)
        cardRec.name[i-10]=readstr[i];
        
        cardRec.valid=readstr[17];
        
        ret=pfwrite(fd,0,(char*)&cardRec,sizeof(struct CARD_REC));
        
        if(ret!=0)
        {
            display_clear(4);
            display_cen(4,"写入文件失败");
            delay(1);
            return(FAIL);
        }
        else 
        {
            display_clear(4);
            display_cen(4,"写入文件成功");
            delay(1);
        }
        /* 发ACK给主机,提示发送下条一记录 */
        h_char=0x06 ;
        sendrs232(1,&h_char);
        
    }
    while(1);
}

/**************************************
函数名称:kq_dataUpload_all	
函数功能:成批上送全部考勤记录	
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int kq_dataUpload_all(void)
{
    int i,ret ;
    char fd ;
    struct KQ_REC kqRec ;
    char upStr[25];
    
    cls();
    display_inv(1,"实达外设考勤");
    display_cen(3,"正在上传");
    
    fd=pfopen("water",'R');
    if(fd==0||fd=='E')
    {
        display_clear(3);
        display_cen(3,"无数据可上传");
        delay(1);
        return(FAIL);
    }
    /*  POS与主机握手 */
    if(handshake_to_host()==FAIL)
    {
        offline_flag=YES ;
        display_clear(3);
        display_cen(3,"与主机握手失败");
        systemsound(500);
        delay(1);
        return(FAIL);
    }
    else 
    {
        display_clear(3);
        display_cen(3,"与主机握手成功");
    }
    for(i=1;;i++)
    {
        ret=pfread(fd,i,1,(char*)&kqRec);
        if(ret==0)
        {
            display_clear(4);
            display_cen(4,"全部数据传完");
            break ;
        }
        if(kqRec.upload_flag=='+')
        {
            if(pfdelrec(fd,i)==0)
            {
                display_clear(3);
                display(3,"删除已上传记录");
                i--;
            }
            continue ;
        }
        sprintf(upStr,"C%8.8sD20%6.6sT%6.6s*",kqRec.card_no,kqRec.date,kqRec.time);
        
        send_to_host(sizeof(upStr),upStr);
        
        /* 加入主机返回的校验结果判断 */
        if(kq_result()==SUCC)
        {
            display_clear(3);
            display_cen(3,"数据上传成功");
            if(pfdelrec(fd,i)==0)
            {
                display_clear(3);
                display_cen(3,"删除已上传记录");
                i--;
            }
        }
        else 
        {
            display_clear(3);
            display_cen(3,"数据上送失败");
            delay(1);
            return(FAIL);
        }
    }
    return(SUCC);
}
/**************************************
函数名称:kq_dataUpload_now	
函数功能:实时上送考勤记录	
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int kq_dataUpload_now(void)
{
    char upStr[25];
    
    memset(upStr,'\0',sizeof(upStr));
    sprintf(upStr,"C%8.8sD20%6.6sT%6.6s",track2,kq_date,kq_time);
    /* POS与主机握手   */
    display_clear(4);
    display_inv(4,"正在与主机握手");
    if(handshake_to_host()==FAIL)
    {
        offline_flag=YES ;
        display_clear(4);
        display_cen(4,"与主机握手失败");
        systemsound(500);
        delay(1);
        return(FAIL);
    }
    else 
    {
        display_clear(4);
        display_cen(4,"与主机握手成功");
    }
    send_to_host(sizeof(upStr),upStr);
    /*加入主机返回的检验结果判断*/
    return(kq_result());
}
/************************************** 
函数名称:kq_dataSave	
函数功能:保存一条考勤记录	
函数参数:	无 
函数返回:SUCC/FAIL 
**************************************/
int kq_dataSave(void)
{
    char fd,ret ;
    struct KQ_REC kqRec ;
    
    fd=pfopen("water",'W');
    if(fd==0||fd=='E')
    {
        return(FAIL);
    }
    
    kqRec.upload_flag=upload_flag ;
    strcpy(kqRec.card_no,track2);
    strcpy(kqRec.date,kq_date);
    strcpy(kqRec.time,kq_time);
    
    ret=pfwrite(fd,0,(char*)&kqRec,sizeof(struct KQ_REC));
    if(ret!=0)
    return(FAIL);
    else 
    return(SUCC);
}
/**************************************
函数名称:kq_dataPrint_all	
函数功能:打印流水文件中全部的考勤记录	
函数参数:	无
函数返回:	SUCC/FAIL
**************************************/
int kq_dataPrint_all(void)
{
    int i,ret ;
    char fd ;
    struct KQ_REC kqRec ;
    char title ;
    
    cls();
    display_inv(1,"实达外设考勤");
    display_cen(3," 正在打印");
    
    fd=pfopen("water",'R');
    if(fd==0||fd=='E')
    {
        display_cen(3,"无数据可打印");
        delay(1);
        return(FAIL);
    }
    while(get_printer_status())
    {
        display_inv(3,"请装好打印纸");
        systemsound(50);
        semiautoloadpaper();
        if(inkey(3)==CANCEL)return(FAIL);
    }
    
    title=NO ;
    for(i=1;;i++)
    {
        ret=pfread(fd,i,1,(char*)&kqRec);
        if(ret==0)
        {
            display_clear(3);
            display_cen(3,"数据已经打完");
            delay(1);
            break ;
        }
        if(title==NO)
        {
            feed_printer(1);
            printer("******Print All******");
            feed_printer(1);
            printer("U+:data had sent!");
            feed_printer(1);
            printer("U-:data hadn't sent!");
            title=YES ;
        }
        feed_printer(1);
        printer("U%c %8.8s %6.6s %6.6s",kqRec.upload_flag,kqRec.card_no,kqRec.date,kqRec.time);
    }
    return(SUCC);
}
/**************************************
函数名称:	kq_dataPrint_now
函数功能:	打印一条记录
函数参数:	(struct KQ_REC * kqRec)
函数返回:	SUCC/FAIL
**************************************/
int kq_dataPrint_now(void)
{
    while(get_printer_status())
    {
        display_clear(4);
        display_inv(4,"请装好打印纸");
        systemsound(50);
        semiautoloadpaper();
        if(inkey(3)==CANCEL)
        {
            return(FAIL);
        }
    }
    feed_printer(1);
    printer("U%c %8.8s %6.6s %6.6s",upload_flag,track2,kq_date,kq_time);
    return(SUCC);
}

⌨️ 快捷键说明

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