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

📄 isomodem.c

📁 modem数据通信源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        {
            
        }
        else
        {
            uprintf("Drv not initialized 1\r\n");
            return EM_ERROR;
        }
    }
    else
    {
        uprintf("Drv not initialized 2\r\n");    	
    	return EM_ERROR;
    }
#endif
    loop_reset(EG_modem_STS.serial_recvbuf);
    loop_reset(EG_modem_STS.v80_recvbuf);
    loop_reset(EG_modem_STS.hdlc_recvbuf);   
    
	if( (ret = EI_OpenSerial())!=EM_SUCCESS)
    	return ret;
        
    /* check if modem active */
    if(EI_ActiveModem()!=EM_SUCCESS)
        EI_ResetModem();
    if(EI_PatchModem()!=EM_SUCCESS)
        goto drvopen_err1;
    
    NU_Obtain_Semaphore(&(EG_modem_STS.drv_api_SEM),NU_SUSPEND);
    EI_SetModemOnline(EM_ONLINE_AT);
    NU_Release_Semaphore(&(EG_modem_STS.drv_api_SEM));
    
    EI_vOutOfPowerSave();    
    return EM_SUCCESS;

drvopen_err1:
	EI_StopSerial(); 
    return EM_ERROR;
}

uchar   EA_MODEM_ucDrvClose(DevHandle hDevHandle)
{
    UNSIGNED time_cur,sleep_time;
    uchar   ucMode;
    
    uprintf("%s\r\n",__FUNCTION__);
    
    if(EI_JudgeModemHandle(hDevHandle,&ucMode)!=EM_SUCCESS)
        return EM_ERRHANDLE;
    if(EG_modem_STS.online!=EM_ONLINE_AT)
    {
        uprintf("WARN: not in AT,dialoff!\r\n");
        if(EG_modem_STS.mode==EM_MODEM_MODE_PPP)
        {
            EA_MODEM_ucDialOffPpp(hDevHandle);            
        }
        else        
            EA_ucDialOff(hDevHandle);        
    }
    EG_modem_STS.ppp_state = EM_PPP_NOINIT;
    time_cur = NU_Retrieve_Clock();
    uprintf("to last dialoff: %dms \n",(time_cur-EG_modem_STS.dialoff_start)*10);
    switch(EG_modem_STS.modem)
    {
        case EM_MODEM_CX:
            if(EG_modem_STS.dev==DEV_HAND)
            {
                /* hand dev,let modem go into stop mode */
                uprintf("CX hand dev\r\n");
                if(time_cur<EG_modem_STS.dialoff_start+EM_TIME_TICK_IN1S)
                {
                	sleep_time = EM_TIME_TICK_IN1S - (time_cur - EG_modem_STS.dialoff_start);
                	NU_Sleep(sleep_time);
                	uprintf("sleep %dms\r\n",sleep_time*10);
                	EI_StopCx();
                	NU_Sleep(2);                    
                }
                else
                {
                    EI_StopCx();                    
                    NU_Sleep(2);
                }                
            }
            else
            {
                /* not hand dev,do nothing,not into stop mode */
            }
            break;
        case EM_MODEM_SI:
            if(EG_modem_STS.dev==DEV_HAND)
                EI_StopSi();                
            break;
        default:
            break;
    }
    EI_StopSerial();  
    return EM_SUCCESS;
}

uchar	EA_ucDial(DevHandle hDev, const char *pcsBuf)
{
    char    dialstr[100];
    uchar ucMode;
    
    uprintf("API:%s\r\n",__FUNCTION__);
    uprintf("dial: %s",pcsBuf);
    if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
        return EM_ERRHANDLE;
    if(pcsBuf==NU_NULL || (strlen(pcsBuf)==0)||(strlen(pcsBuf)>50))
        return EM_ERRPARAM;
            
    if(EG_modem_STS.online!=EM_ONLINE_AT
        &&EG_modem_STS.online!=EM_ONLINE_OFFLINE
        )
        return EM_ERROR;
    
    memset(dialstr,0,sizeof(dialstr));
    memcpy(dialstr,pcsBuf,strlen(pcsBuf));
    if(strstr(dialstr,"\r")==NULL)
        strcat(dialstr,"\r");
        
    if(strstr(dialstr,"ATDT")==NU_NULL
        &&strstr(dialstr,"ATDP")==NU_NULL
        )
    {
        /* AT cmd */
        if(strstr(dialstr,"AT+PATCH")!=NULL)
        {
            uchar ucRet;
            ucRet = EI_ATPatch((char *)dialstr);
            if(ucRet==EM_SUCCESS)
                return EM_modem_ATCOMRIGHT;
            else if(ucRet==EM_modem_NOPATCH)
                return EM_modem_NOPATCH;
            else
                return EM_modem_ATCOMERROR;
        }
        else if(strstr(dialstr,"AT+IOCTL")!=NULL)
        {
            return(EI_ucModemIoctl(dialstr));
        }
        else
        {
            uchar ucRet;
            ucRet = EI_SendAT_OK((char *)dialstr,3);
            if(ucRet==EM_SUCCESS)
                return EM_modem_ATCOMRIGHT;
            else 
                return EM_modem_ATCOMERROR;
        }
    }
    EI_vLineToModem();
    
    if(EI_SendATE0_OK()!=EM_SUCCESS)
        goto dial_err;
    switch(EG_modem_STS.modem)
    {
        case EM_MODEM_CX:
            if(EI_SendAT_OK("ATS12=2\r",1)!=EM_SUCCESS
                )
                goto dial_err;            
            break;
        case EM_MODEM_SI:
            if(EI_SendAT_OK("AT\\V2\r",1)!=EM_SUCCESS
                ||EI_SendAT_OK("ATS12=2\r",1)!=EM_SUCCESS
                )
                goto dial_err;
            break;
        default:
            goto dial_err;
    } 
    
    /* here we must protect it */
    NU_Obtain_Semaphore(&(EG_modem_STS.drv_api_SEM),NU_SUSPEND);
    EI_SetModemOnline(EM_ONLINE_DIALING);
    EG_modem_STS.dialing_buf_len = 0;
    memset(EG_modem_STS.dialing_buf,0x00,sizeof(EG_modem_STS.dialing_buf));
    EG_modem_STS.dial_err = EM_DIALERR_NONE;
    EG_modem_STS.dial_start = NU_Retrieve_Clock();    
    EG_modem_STS.dial_connect = 0;
    EI_vShow(EM_icon_SHOW,EM_icon_MODEM);
    loop_reset(EG_modem_STS.serial_recvbuf);
    NU_Release_Semaphore(&(EG_modem_STS.drv_api_SEM));
    
    EI_SendAT(dialstr);
    return EM_SUCCESS;
dial_err:
    EI_vLineToPhone();
    return EM_ERROR;
}

uchar	EA_ucDialOff(DevHandle hDev)
{
    uchar ucMode;
    
    uprintf("API:%s\r\n",__FUNCTION__);
    if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
        return EM_ERRHANDLE;    
        
    EI_vShow(EM_icon_HIDDEN,EM_icon_ONLINE);
	EI_vShow(EM_icon_HIDDEN,EM_icon_DCD);
	EI_vShow(EM_icon_HIDDEN,EM_icon_MODEM);
	
	NU_Obtain_Semaphore(&(EG_modem_STS.drv_api_SEM),NU_SUSPEND);
	EI_SetModemOnline(EM_ONLINE_AT);
	EG_modem_STS.dial_err = EM_DIALERR_NONE;
	NU_Release_Semaphore(&(EG_modem_STS.drv_api_SEM));
	
	/* add DTR func here */
    rPDATC |= EM_MODEM_DTR;
    uprintf("set dtr to inactive\n");
	NU_Sleep(20);
	rPDATC &= ~EM_MODEM_DTR;	
	uprintf("set dtr to active\n");
	
	NU_Sleep(5);
	EI_WriteUart("+++",3);
	NU_Sleep(10);
	EI_WriteUart("ATH0\r",5);
	NU_Sleep(5);
	
	EI_vLineToPhone();
	loop_reset(EG_modem_STS.serial_recvbuf);
    loop_reset(EG_modem_STS.v80_recvbuf);
    loop_reset(EG_modem_STS.hdlc_recvbuf);
	EG_modem_STS.dialoff_start = NU_Retrieve_Clock();	
	
    return EM_SUCCESS;
}

uchar	EA_ucInitSdlc(DevHandle hDev,uchar ucBPS,
					  uchar ucSdlcAD, uchar ucSST)
{
    uchar ret;
    
    uprintf("API:%s\r\n",__FUNCTION__);
    ret = EI_VerifyHandle_sync(hDev);
	if(ret != EM_SUCCESS)
		return EM_ERRHANDLE;		
    	    
    if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
       &&EG_modem_STS.online!=EM_ONLINE_AT)
	    return EM_ERROR;
	if(ucBPS!=EM_modem_V22FC
	    &&ucBPS!=EM_modem_V22
	    &&ucBPS!=EM_modem_V22BIS
	    &&ucBPS!=EM_modem_Bell212
	    )
	    return EM_ERROR;
	if(EG_patch_Info.ucProfileUse==1
	    &&EG_patch_Info.uiInitSdlcLen>0
	    )
	{
	    uprintf("use patch initsdlc\r\n");
	    if(EI_PatchAT(EG_patch_Info.m_pcInitSdlc,EG_patch_Info.uiInitSdlcLen)!=EM_SUCCESS)
	        return EM_ERROR;
	}
	else
	{
	    switch(EG_modem_STS.modem)
        {
            case EM_MODEM_CX:
                if(ucBPS==EM_modem_V22FC)   /* EM_modem_1200BPS */   
                    ret = EI_SendAT_OK("AT%C0\\N0;+A8E=,,,0;$F2;+MS=V22;+ES=6,,8;+ESA=0,0,,,1,0;S17=13\r",3);
                else if(ucBPS==EM_modem_V22)
                    ret = EI_SendAT_OK("AT%C0\\N0;+A8E=,,,0;$F0;+MS=V22;+ES=6,,8;+ESA=0,0,,,1,0;S17=13\r",3);
                else if(ucBPS==EM_modem_V22BIS)
                    ret = EI_SendAT_OK("AT%C0\\N0;+A8E=,,,0;$F0;+MS=V22B;+ES=6,,8;+ESA=0,0,,,1,0;S17=13\r",3);
                else if(ucBPS==EM_modem_Bell212)
                    ret = EI_SendAT_OK("AT%C0\\N0;+A8E=,,,0;$F2;+MS=B212;+ES=6,,8;+ESA=0,0,,,1,0;S17=13\r",3);
                /*else if(ucBPS==EM_modem_V29FC)
                    ret = EI_SendAT_OK("AT%C0\\N0;+A8E=,,,0;$F4;+ES=6,,8;+ESA=0,0,,,1,0;S17=13\r",3);*/
                else
                    ret = EI_SendAT_OK("AT%C0\\N0;+A8E=,,,0;$F2;+MS=V22;+ES=6,,8;+ESA=0,0,,,1,0;S17=13\r",3);                
                break;
            case EM_MODEM_SI:
                if(EI_SendAT_OK("AT\\N0\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT+ES=6,,8\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT+ESA=0,0,0,,1,0\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT+IFC=2,2\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT+ITF=0383,0128\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT:U87,050A\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT+MS=V22\r",1)!=EM_SUCCESS
                    ||EI_SendAT_OK("AT:U7A,3\r",1)!=EM_SUCCESS
                    )
                    ret = EM_ERROR;
                else
                    ret = EM_SUCCESS;
                break;
            default:
                ret = EM_ERROR;
                break;
        }
        if(ret!=EM_SUCCESS)
            return EM_ERROR;
	}
    
    EG_modem_STS.hdlc_s.addr = ucSdlcAD;
    EG_modem_STS.hdlc_s.re_cnt = ucSST;
    EG_modem_STS.mode = EM_MODEM_MODE_SDLC;
    return EM_SUCCESS;
}

uchar   EA_ucSendSdlc(DevHandle hDevHandle , uint uiLen , const char *pcBuf)
{
    uchar ret;
    UNSIGNED time_cur,time_start;
    
    uprintf("API:%s %d\r\n",__FUNCTION__,uiLen);
    ret = EI_VerifyHandle_sync(hDevHandle);
	if(ret != EM_SUCCESS)
		return EM_ERRHANDLE;
	if(pcBuf==NULL||uiLen>1024)
	    return EM_ERRPARAM;
	if(EG_modem_STS.online!=EM_ONLINE_DATA)
	    return EM_ERROR;
	if (uiLen==0)
		return EM_SUCCESS;
	
	//TRACE_CONTENTS(uiLen,pcBuf);	
    time_start = NU_Retrieve_Clock();    
    while(1)
    {
        if(EG_modem_STS.online!=EM_ONLINE_DATA)
            return EM_ERROR;
        /* here we must protect the EI_SetHdlc_sendflag() and hdlc_s.resend_buf */
        NU_Obtain_Semaphore(&(EG_modem_STS.drv_api_SEM),NU_SUSPEND);
        if(EG_modem_STS.hdlc_s.send_flag==EM_HDLC_TRANSMIT_NODATA)
        {
            EI_SetHdlc_sendflag(EM_HDLC_TRANSMIT_DATA);
            EI_hdlc_send_iframe((uchar *)pcBuf,uiLen);
            NU_Release_Semaphore(&(EG_modem_STS.drv_api_SEM));
            break;
        }
        else
        {
            NU_Release_Semaphore(&(EG_modem_STS.drv_api_SEM));
            NU_Sleep(1);
        }
        time_cur = NU_Retrieve_Clock();
        if(time_cur>=time_start+EM_TIME_TICK_IN1S*10)   /* 10 seconds time out */
            return EM_ERROR;
    }    
    while(1)
    {
        if(EG_modem_STS.online!=EM_ONLINE_DATA)
            return EM_ERROR;
        if(EG_modem_STS.hdlc_s.send_flag==EM_HDLC_TRANSMIT_NODATA)
            return EM_SUCCESS;
        time_cur = NU_Retrieve_Clock();
        if(time_cur>=time_start+EM_TIME_TICK_IN1S*10)   /* 10 seconds time out */
            return EM_ERROR;
        NU_Sleep(1);
    }
}

uchar	EA_ucReadSdlc(DevHandle hDevHandle , uint uiSecond , void *pvBuf , uint *puiRealLen )
{
    uchar ret;
    unsigned int tout = 0;
    unsigned int uiRet = 0;
    UNSIGNED time_cur,time_start;
    
    uprintf("API:%s\r\n",__FUNCTION__);    
    ret = EI_VerifyHandle_sync(hDevHandle);
	if(ret != EM_SUCCESS)
		return EM_ERRHANDLE;
	if(pvBuf==NULL||puiRealLen==NULL)
		return EM_ERRPARAM;
    if(uiSecond==0||uiSecond>60)
        tout = EM_TIME_TICK_IN1S*60;
    else
        tout = EM_TIME_TICK_IN1S*uiSecond;
        
    *puiRealLen = 0;    /* do not forget it! */
    time_start = NU_Retrieve_Clock();
	while(1)
	{
	    if(EG_modem_STS.online!=EM_ONLINE_DATA)
            return EM_ERROR;
	    uiRet = loop_read(EG_modem_STS.hdlc_recvbuf,(char *)pvBuf,1024);
	    if(uiRet>0)
	    {
	        *puiRealLen = uiRet;
	        //TRACE_CONTENTS(uiRet,pvBuf);
	        return EM_SUCCESS;
	    }
	    time_cur = NU_Retrieve_Clock();
	    if(time_cur>=time_start+tout)
            return EM_SUCCESS;

⌨️ 快捷键说明

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