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

📄 isomodem.c

📁 modem数据通信源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        NU_Sleep(1);
	}
}
				  
uchar	EA_ucGetLineStatus(DevHandle hDev, uchar *pucSTS)
{
    uchar ucMode;
    
    if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
        return EM_ERRHANDLE;
    if(pucSTS==NULL)
        return EM_ERRPARAM;
    
    if(EG_modem_STS.dial_err!=EM_DIALERR_NONE)
    {
        switch(EG_modem_STS.dial_err)
        {
            case EM_DIALERR_NOCARRIER:
                return EM_modem_NOCARRIER;
            case EM_DIALERR_NOANSWER:
                break;
            case EM_DIALERR_NODIALTONE:
                return EM_modem_NODIALTONE;
            case EM_DIALERR_BUSY:
                return EM_modem_LINEBUSY;
            case EM_DIALERR_TIMEOUT:
                return EM_modem_TIMEOUT;
            case EM_DIALERR_ELSE:
                return EM_modem_NOCARRIER;
            default:
                uprintf("FATAL ERROR:%s",__FUNCTION__);
                return EM_modem_NOCARRIER;
        }
    }
    if(EG_modem_STS.online==EM_ONLINE_CONNECTED
        ||EG_modem_STS.online==EM_ONLINE_DIALING
        )
        return EM_modem_INPROCESS;
    else if(EG_modem_STS.online==EM_ONLINE_DATA)
    {
        *pucSTS = EM_modem_CNT1200V22;             /* write a random speed */
        return EM_SUCCESS;
    }
    else if(EG_modem_STS.online==EM_ONLINE_OFFLINE
            ||EG_modem_STS.online==EM_ONLINE_AT
            )
    return EM_ERROR;
    
    uprintf("FATAL ERROR:%s",__FUNCTION__);
    return EM_ERROR;
}

uchar   EA_ucIfExistDialTone(DevHandle hDev)
{   
    uchar ucMode;
    
    uprintf("API:%s\r\n",__FUNCTION__);
    
    if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
        return EM_ERRHANDLE;
	
	if(EG_modem_STS.online==EM_ONLINE_OFFLINE
       ||EG_modem_STS.online==EM_ONLINE_AT
       )
    {
        return EI_Ifexistdialtone();
    }
    
    return EM_ERROR;
}

uchar EI_InitDial(uchar ucBPS, uchar ucPAR, uchar ucDBS)
{
    if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
       &&EG_modem_STS.online!=EM_ONLINE_AT)
	    return EM_ERROR;	    
	if(!(ucPAR==EM_modem_NOPAR||ucPAR==EM_modem_EVENPAR||ucPAR==EM_modem_ODDPAR))
		return EM_ERRPARAM;
	if(ucDBS!=EM_modem_8DBS)
		return EM_ERRPARAM;
    if(ucBPS!=EM_modem_1200BPS
        &&ucBPS!=EM_modem_2400BPS
        &&ucBPS!=EM_modem_9600BPS
        &&ucBPS!=EM_modem_14400BPS
        &&ucBPS!=EM_modem_19200BPS
        &&ucBPS!=EM_modem_24000BPS
        &&ucBPS!=EM_modem_26400BPS
        &&ucBPS!=EM_modem_28800BPS
        &&ucBPS!=EM_modem_33600BPS
        &&ucBPS!=EM_modem_NONEBPS
        )
		return EM_ERRPARAM;
    
    if(EG_modem_STS.mode==EM_MODEM_MODE_SDLC)
    {
        /* 这里不能用AT&F/ATZ之类的命令回默认值,因为这有可能破坏补丁的作用 */
        EI_ResetModem();
        EI_PatchModem();
    }
    if(EG_patch_Info.ucProfileUse==1
	    &&EG_patch_Info.uiInitAsysLen>0
	    )
	{
	    uprintf("use patch initsdlc\r\n");
	    if(EI_PatchAT(EG_patch_Info.m_pcInitAsys,EG_patch_Info.uiInitAsysLen)!=EM_SUCCESS)
	        return EM_ERROR;
	}
	else
	{
        if(EI_SendAT_OK("AT+MS=V34,1,300,33600,300,33600\r",1)!=EM_SUCCESS)
            return EM_ERROR;
	}
	
    EG_modem_STS.mode = EM_MODEM_MODE_ASYS;
    return EM_SUCCESS;
}

uchar	EA_ucInitDial(DevHandle hDev, uchar ucBPS, uchar ucPAR, uchar ucDBS)
{
    uprintf("API:%s\r\n",__FUNCTION__);
    
	if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)	
		return EM_ERRHANDLE;
		
	return EI_InitDial(ucBPS,ucPAR,ucDBS);
}

uchar	EA_ucInitRingDetect(DevHandle hDev)
{
    uprintf("API:%s\r\n",__FUNCTION__);
    
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)	
		return EM_ERRHANDLE;
    if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
       &&EG_modem_STS.online!=EM_ONLINE_AT)
	    return EM_ERROR;
	if(EI_Ifexistdialtone()==EM_modem_PHONEINUSE)
	    return EM_modem_PHONEINUSE;
	
	EG_modem_STS.ring_detect = EM_ERROR;
	return EM_SUCCESS;
}

uchar	EA_ucRingDetect(DevHandle hDev)
{
    //uprintf("API:%s\r\n",__FUNCTION__);
    
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)	
		return EM_ERRHANDLE;
	
	return EG_modem_STS.ring_detect;
}

uchar   EA_ucAnswerModem(DevHandle hDev,uchar ucBPS,uchar *pucSTS)
{
    uprintf("API:%s\r\n",__FUNCTION__);
    
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)	
		return EM_ERRHANDLE;
    if(pucSTS==NULL)
        return EM_ERROR;
    if(EG_modem_STS.online!=EM_ONLINE_OFFLINE
       &&EG_modem_STS.online!=EM_ONLINE_AT)
	    return EM_ERROR;

	if(EI_InitDial(ucBPS,EM_modem_NOPAR,EM_modem_8DBS)!=EM_SUCCESS)
	    return EM_ERROR;
    
    /* 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_vLineToModem();
	EI_SendAT("ATA\r");
	
	while(1)
	{
	    if(EG_modem_STS.online==EM_ONLINE_DIALING)
	        NU_Sleep(1);
	    else if(EG_modem_STS.online==EM_ONLINE_DATA)
	    {
	        *pucSTS = EM_modem_33600BPS;
	        return EM_SUCCESS;
	    }
	    else if(EG_modem_STS.online==EM_ONLINE_OFFLINE)
	        goto answer_err;
	    else
	    {
	        uprintf("FATAL ERROR:%s online=%d\r\n",__FUNCTION__,EG_modem_STS.online);
	        goto answer_err;
	    }
	}
answer_err:
    EI_vLineToPhone();
    return EM_ERROR;
}

uchar 	EA_ucIfModemRecBufEmpty(DevHandle hDev,uchar *pucBufStatus)
{
    uprintf("API:%s\r\n",__FUNCTION__);
    
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS
        &&EI_VerifyHandle_sync(hDev)!=EM_SUCCESS)
        return EM_ERRHANDLE;
    if(pucBufStatus==NULL)
        return EM_ERRPARAM;
    
    if(EG_modem_STS.online!=EM_ONLINE_DATA)
    {
        /* 非数据态 */
        *pucBufStatus = EM_BUFEMPTY ;
        return EM_SUCCESS;
    }
    switch(EG_modem_STS.mode)
    {
        case EM_MODEM_MODE_SDLC:
            if(loop_size(EG_modem_STS.hdlc_recvbuf)>0)
                *pucBufStatus = EM_BUFNOEMPTY ;
            else
                *pucBufStatus = EM_BUFEMPTY ;
            break;
        case EM_MODEM_MODE_ASYS:
            if(loop_size(EG_modem_STS.serial_recvbuf)>0)
                *pucBufStatus = EM_BUFNOEMPTY ;
            else
                *pucBufStatus = EM_BUFEMPTY ;
            break;
        default:
            if(loop_size(EG_modem_STS.serial_recvbuf)>0)
                *pucBufStatus = EM_BUFNOEMPTY ;
            else
                *pucBufStatus = EM_BUFEMPTY ;
            break;
    }
    return EM_SUCCESS;
}

uchar	EA_ucClrModemRecBuf(DevHandle hDev)
{
    uprintf("API:%s\r\n",__FUNCTION__);;
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS
        &&EI_VerifyHandle_sync(hDev)!=EM_SUCCESS)
        return EM_ERRHANDLE;
    switch(EG_modem_STS.mode)
    {
        case EM_MODEM_MODE_SDLC:
            loop_reset(EG_modem_STS.hdlc_recvbuf);
            break;
        case EM_MODEM_MODE_ASYS:
        default:
            loop_reset(EG_modem_STS.serial_recvbuf);
            break;                    
    }
    return EM_SUCCESS;
}

uchar   EA_ucIfPhoneUsed(DevHandle hDevHandle)
{
    return EA_ucIfExistDialTone(hDevHandle);
}

uchar   EA_ucModemIoctl(DevHandle hDev,ulong cmd,void *argu)
{
    uchar ucMode;
    uchar ucRet=EM_SUCCESS;
    
    uprintf("API:%s\r\n",__FUNCTION__);;
    if(EI_JudgeModemHandle(hDev,&ucMode)!=EM_SUCCESS)
        return EM_ERRHANDLE;
    switch(cmd)
	{
	    case EM_modem_CMD_RESET_MODEM:	   
	        ucRet = EI_ResetModem();
	        break;     
	    case EM_modem_CMD_DEBUG_ON:
	        ucRet = EI_ucIoctlDebug(1);	        
	        break;	        
	    case EM_modem_CMD_DEBUG_OFF:
	        ucRet = EI_ucIoctlDebug(0);	        
	        break;
	    case EM_modem_CMD_TEST_LINE:
            EI_ucTestLine();
            return EM_SUCCESS;
        case EM_modem_CMD_CONNECT_TIME:
            EI_ucSetConnectTime(argu);
            return EM_SUCCESS;
        case EM_modem_CMD_SNRM_TIME:
            EI_ucSetSnrmTime(argu);
            return EM_SUCCESS; 		        
	    default:
	        ucRet = EM_ERROR;
	        break;
	}
    return ucRet;    
}

uchar	EA_ucSendAsys(DevHandle hDev, uint uiBufSize , const char *pcsBuf)
{
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)	
		return EM_ERRHANDLE;
	
	if(pcsBuf==NULL)
	    return EM_ERRPARAM;
	if(uiBufSize==0)
	    return EM_SUCCESS;
	if(EG_modem_STS.online!=EM_ONLINE_DATA)
	    return EM_ERROR;
	
	EI_WriteUart((char *)pcsBuf,uiBufSize);
	return EM_SUCCESS;
}

uchar	EA_ucReadAsys(DevHandle hDev, uint uiSecond , uint uiReadLen , 
					  void *pvBuf , uint *puiBufSize)
{
    unsigned int tout;
    UNSIGNED time_start,time_cur;
    unsigned int pos = 0;
    int ret;
    
    if(EI_VerifyHandle_asyn(hDev)!=EM_SUCCESS)	
		return EM_ERRHANDLE;
    if(pvBuf==NULL||puiBufSize==NULL)
		return EM_ERRPARAM;
    time_start = NU_Retrieve_Clock();
    if(uiSecond==0||uiSecond>60)
        tout = EM_TIME_TICK_IN1S*60;
    else
        tout = EM_TIME_TICK_IN1S*uiSecond;
        
    *puiBufSize = 0;
    while(1)
    {
        if(EG_modem_STS.online!=EM_ONLINE_DATA)
            return EM_ERROR;
        time_cur = NU_Retrieve_Clock();
        ret = loop_read(EG_modem_STS.serial_recvbuf,(char *)pvBuf+pos,uiReadLen-pos);
        if(ret>0)
            pos+=ret;
        if(pos>=uiReadLen||time_cur>=(time_start+tout))
            break;        
    }
    *puiBufSize = pos;
    return EM_SUCCESS;
}

char *cx_all[]={
	"S30E00001700A9008D17463403D72217\r",
	"S306000047DF4093\r",
	"S306000047E4FFCF\r",
	"S32500004B5926434849303031850DABE4140E28C3F677B40CB0F4140EA0C56C6C00FF000C90B2\r",
	"S32500004B79014A0C01E7CC0C28C3F677CC0C5EF9CC0CA0C5176700FF0002B01080150A42001B\r",
	"S32500004B990E00130F64000301000000000041DC022003320000001E010A0700002C00FF2F60\r",
	"S32500004BB9FF1FFF0F03020A0041000A0041000414007800100058020219005A0019005A002D\r",
	"S32500004BD9030000000000000000010000000000000000010A0041000A00410004140078008B\r",
	"S32500004BF9B40058020219005A0019005A00030000000000000000010000000000000000019B\r",
	"S32500004C196400005A5A4700000000004B2C0100000000000014000500000500780000000008\r",
	"S32500004C390000000000201C010007004600008311401B00000800060208020701FF5A080158\r",
	"S32500004C59FF010901FF060A01FE0E0B32FF551BFF00491CFF00001D0564325B010F0A5C0A6D\r",
	"S30800004C790F0AFF1A\r"
};

char cx_default_patch_info[]=
"[TYPE=1]\x0d\x0a"
"[PATCH_BEGIN]\x0d\x0a"
"S32500003000A9008D1746830200200D3080FB4303C901B0577C163066306B308030853080309B\x0d\x0a"
"S3250000302090308030B4308030B4308030B430803007318030A4305E3065306530B94B308531\x0d\x0a"
"S3250000304040B94C3085414303F9AC604D300D0A52414D204C6F6164204572726F7200A00006\x0d\x0a"
"S32500003060203C30A22260C953F03760C390C930F0301419C933F02A1419C937F024A22060E5\x0d\x0a"
"S3250000308020B831801C20B831C3A314B3C3B3801120B831043AC000F004C080D0E0C3C3C314\x0d\x0a"
"S325000030A080E8E86020B831043AC31AC9FFD0CEC3297C183120B831043A0488048804880430\x0d\x0a"
"S325000030C08804880488048804880438E016D0D2830D000016F30BF02CF309F0C5F30CF0C13D\x0d\x0a"
"S325000030E092080000164E00166E02166E0116AD01168D160CAD02168D170C7B0CB494C2082A\x0d\x0a"
"S325000031001F0C809DA21C6020B831043A98A39DCACA14FBD00214326056311E315731A20009\x0d\x0a"
"S32500003120F30CD016830C000016F4CDC33DF027A31CA39888D0F960A26560F21B0C80F88301\x0d\x0a"
"S325000031400C000016F4CDC33DA31C8D800CA31C8D810C8888D0F260F308F008F30CD0094395\x0d\x0a"
"S32500003160006631A20060C37892080000164E00166E02166E01164E00166E02166E0116A93E\x0d\x0a"
"S32500003180008D740C8D750CA9D08D720CA9128D730CA9408D740CA9008D750CAD01168D7253\x0d\x0a"
"S325000031A00CAD02168D730CA9808D740CA9008D750CC2081F0CA2006004330433043304336C\x0d\x0a"
"S31F000031C038E9309011C90A900AE9119009C906B005890A041360DBA2206072\x0d\x0a"
"S70500003000CA\x0d\x0a"
"S025000000000123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEFDA\x0d\x0a"

⌨️ 快捷键说明

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