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

📄 pctalk.c.bak

📁 m68k手持机的通讯相关源码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
	   for(i=0;i<NUMOFDBTABLE;i++) 
	      g_arr_total_exist[i] = 0;
    	} else {
        	if(ret=DB_erase_filesys(fsid)){
	        	sprintf(msg,"删除%s出错",g_strTableName[fsid]);
		        DispStr_CE(0,2,msg,DISP_CENTER|DISP_CLRSCR);	
	        	delay_and_wait_key( 5, 0, 0 );
	        	return FAILURE;
	        }else {
	        	g_arr_total_exist[fsid] = 0;
	        }
    	}
    	DispStr_CE(0,2,"删除成功",DISP_CENTER|DISP_CLRSCR);	
    	return SUCCESSFUL;
}

short dt_send_tab_data_doing(unsigned char des,unsigned char src,int fsid)
{
	unsigned char msg[30];
	int datalen;
	int i,j;
	int rec_size;
	unsigned long count,count1;
	char *recwfbuf;
	char flag;
	int NUM_TO_SEND;
	int pos;
	unsigned long count_send=0;
	unsigned char data[MAX_NUMBER_DT_DATA+30];
		
        count_db_toal(fsid,&count,&count1);//注意counter1和counter的差别		
	sprintf(msg,"发送表%d共%d条...",fsid+1,count);
	DispStr_CE(0,0,msg,DISP_POSITION|DISP_CLRSCR);
            
	data[0] = CMD_RTD;
	data[1] = CMD_RECV_DATA;
	data[2] = fsid;
	count_send = 0;
	rec_size = g_rec_size[fsid];
	NUM_TO_SEND = (MAX_NUMBER_DT_DATA - 10)/rec_size;

	for (i=0; i < count1/NUM_TO_SEND; i ++)//!!!这里必须是counter1!!!!
	{
	   	sprintf(msg, "%3d", (i+1)*NUM_TO_SEND);
       		DispStr_CE(2,2,msg,DISP_POSITION);
		datalen = 3;
	  	for(j=0,pos=0;j<NUM_TO_SEND;j++)
		{
		      recwfbuf = (char *)DB_jump_to_record(fsid, i*NUM_TO_SEND+j, &flag);
		      //if(flag) continue;
		      //TRACE("flag:%d ,%d",flag,i);
		      memcpy(&data[3+pos*rec_size],recwfbuf,rec_size);
		      datalen += rec_size;
		      pos++;
		      count_send++;
		}
		if(dt_send(des,src,data, datalen) != SUCCESSFUL)
		{
		      TRACE("dt_send err:send doing");
		      return FAILURE;
		}
	}
	datalen = 3;
	if(count%NUM_TO_SEND)
	{
	   for(j=0,pos=0;j<count1%NUM_TO_SEND;j++)//!!!这里必须是counter1!!!!
	   {
	     recwfbuf = (char*)DB_jump_to_record(fsid,(count/NUM_TO_SEND)*NUM_TO_SEND+j,&flag);
	     if(flag) continue;
	     memcpy(&data[3+pos*rec_size],recwfbuf,rec_size);
	     datalen += rec_size;
	     pos++;
	     count_send++;
	   }
	   if(dt_send(des,src,data, datalen) != SUCCESSFUL)
	   {
		    TRACE("dt_send err:send doing1");
	   		return FAILURE;
	   }
	}
	//数据记录已发送完毕
	data[0] = CMD_RTC;
	data[1] = CMD_RECV_DATA;
	datalen = 2;
	if ((dt_send(des,src,data, datalen) != SUCCESSFUL))
	{
		TRACE("dt_send err:send doing2");
		return FAILURE;
	}
	sprintf(msg,"传输完毕共%d条", count_send);
        DispStr_CE(0,2,msg,DISP_POSITION);	
        return SUCCESSFUL;
}

//pos 请求发送数据,在循环查询时使用,该函数只是在无线传输的过程中使用
short dt_send_tab_data(unsigned char des,unsigned char src,unsigned char fsid)
{
	unsigned long count;
	short ret;
        
	count = DB_count_records(fsid);

	DisKeyInt(); //关键盘中断
	ret = dt_tab_data_send_request(des,src,fsid,count);
	if(ret == SUCCESSFUL)
	{ 
		ret = dt_send_tab_data_doing(des,src,fsid);
	        EnKeyInt(); //开键盘中断
		if(ret == SUCCESSFUL)
		{
		} else {
			DispStr_CE(0,2,"发送数据失败!",DISP_POSITION|DISP_CLRSCR);
			delay_and_wait_key(0,EXIT_KEY_ALL,0);
		}
	}else{
   		EnKeyInt(); //开键盘中断
		DispStr_CE(0,2,"发送请求失败!",DISP_POSITION|DISP_CLRSCR);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
	}
	return ret;
}

// count: number of total items
//
short wait_for_tab_data(unsigned char pa_des,unsigned char pa_src,int fsid,unsigned long count)
{
	unsigned char msg[100];
	int datalen,i,rec_size,ret;
	unsigned long count_recv = 0;
	unsigned char src_recv,des_recv;
	unsigned short Acknowledge,new_acknowledge;
	unsigned char data[MAX_NUMBER_DT_DATA+30];
    	unsigned short recNum;
	char *pTmp;
	int err_pa_count;

	DispStr_CE(0,0,"正在接收数据...",DISP_POSITION|DISP_CLRSCR);
	sprintf(msg,"接收表%d共%d条",fsid+1,count);
	DispStr_CE(0,2,msg,DISP_POSITION);
			
	if((fsid<0)||(fsid>5)) 
	{
		DispStr_CE(1,0,"文件号错误.",DISP_CENTER|DISP_CLRSCR);
		delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
	    return FAILURE;
    	}
        rec_size = g_rec_size[fsid];
	count_recv = 0;
	err_pa_count = 0;                                                         	

	while(1)                                                                	
	{                                                                       	
		ret = dt_recv(&des_recv,&src_recv,data,&datalen,&new_acknowledge);                           		
		if(ret != SUCCESSFUL)                    	                                                  		
		{                                                                   	                      		
		    //dt_delay(WAIT_TIME_RESEND);                                                                           	    
		    sprintf(msg,"w_t_d fail:%02x",ret);                                                      	    
		    TRACE(msg);
		    err_pa_count++;
		    if(err_pa_count>40)                                                                           	    
		    {	                                                                                      	    
		        TRACE("w_t_d time out quit");                                                            		
		        getch();
		    	return FAILURE;                                                                       	    
		    }                                     	                                                  	    
		    else                                                            	                      	    
		     	continue;                                                   	                      	    
		}else {
			if(des_recv!=pa_des||src_recv!=pa_src)  //check des and src err
			{
				TRACE("w_t_d:des&src err");
				sprintf(msg,"%02x:%02x:%02x:%02x",des_recv,pa_des,src_recv,pa_src);
				TRACE(msg);
				err_pa_count++;
				if(err_pa_count>20)                //if err counter > 20 quit
				{
					 TRACE("des&src err quit");
					 return FAILURE;
				}
				continue;
			}
			err_pa_count = 0;                                                                                       	    
			if((data[0]==CMD_RTD)&&(data[1]==CMD_RECV_DATA))                                          	    
			{                                                                                         	    
			        if(count_recv == 0)                                                                   		
			        {                                                                                     		
			        	Acknowledge = new_acknowledge;                                                    		
			        } else {                                                                              		
			        	if(Acknowledge + 1 == new_acknowledge)  //数据是不是同一系列数据,防止重发数据     		
			        	{                                                                                 		
			        		Acknowledge++;                                                                		
			        	} else {                                                                          		
			        		continue;                                                                     		
			        	}                                                                                 		
			        }
			        if(data[2]!=fsid)                         //check fsid err
			        {
			        	TRACE("w_t_d:fsid err");
			        	return FAILURE;
			        }                                                                                     		
			        recNum = (datalen-3)/rec_size;                                                        		
			        pTmp = data+3;                                                                        		
			        for(i=0;i<recNum;i++)                                                                 		
			        {                                                                                     		
					if(!DB_add_recordx(fsid,(void*)pTmp,g_arr_total_exist[fsid]))
					{                                                                             		
						delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );                                		
						DispStr_CE(0,0,"空间不足!",DISP_CENTER|DISP_CLRSCR);                      		
						DispStr_CE(0,2,"添加记录失败!",DISP_CENTER);                              		
						delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );                                		
						return FAILURE;                                                           		
					}
					g_arr_total_exist[fsid]++;                                                                             		
			                pTmp += rec_size;                                                             		
			        }                                                                                     		
			        count_recv = count_recv + recNum;                                                     		
			        sprintf(msg, "%3d",count_recv );                                                      		
			        DispStr_CE(0,4,msg,DISP_POSITION);                                                            
			} else if((data[0]==CMD_RTC)&&(data[1]==CMD_RECV_DATA)) {                                 	    
			    	sprintf(msg, "收到表%d:%3d条",fsid+1,count_recv );                            	      		
			        DispStr_CE(0,4,msg,DISP_POSITION);                                                    	    
			    	sprintf(msg, "表%d现有%3d条",fsid+1,g_arr_total_exist[fsid]);                            	      		
			        DispStr_CE(0,6,msg,DISP_POSITION);                                                    	    
			        if(count_recv != count) //收到的数据是否等于请求值                                    	    
			        {                                                                                     	    
					    sprintf(msg, "数据长度错误%d",count );                            	              		
			            DispStr_CE(0,6,msg,DISP_POSITION);                                                		
			            return FAILURE;                                                                   		
			        } else {                                                                              	    
			        	return SUCCESSFUL;                                                                	    
			        }                                                                                     	    
			}                                                                                         	    
		}                                                                                             	    
	}
}
//************************************************************************************************
//End
//************************************************************************************************

⌨️ 快捷键说明

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