我在做这方面的工作,要求:MODEM自动应答,连接后传输数据!!!!
请问哪位兄弟能帮帮我啊????我现在在做,可不尽人意,能拨号与连接了,但有时消息检测不到!!!

解决方案 »

  1.   

    有谁有这方面的源码啊?能发一份吗?另加500分!!!
    [email protected]
    [email protected]
      

  2.   

    有谁有这方面的源码啊?能发一份吗?另加500分!!!
    [email protected]
    [email protected]
      

  3.   

    可以不使用TAPI,可以使用AT指令直接控制MODEM
      

  4.   

    我也不是一定要用TAPI啊,我是想哪个好用就用哪个啊,AT我开始也用了,不好用啊!谁有源码啊?救我啊!!!!!!
      

  5.   

    我现在最最主要的是得不到MODEM串口的句柄啊!
    我用了两种方法:
    1:
        LPVARSTRING lpVarStringStruct = NULL;
        size_t sizeofVarStringStruct = sizeof( VARSTRING ) + 1024;

        long lreturn;
        // get the comm handle.  Be sure to drop this handle when
        // the call is done or you'll get device unavailable errors
        // and have to REBOOT!
        lpVarStringStruct = ( LPVARSTRING )LocalAlloc( 0, sizeofVarStringStruct );
        do
        {
            memset( lpVarStringStruct, 0, sizeofVarStringStruct );
            lpVarStringStruct->dwTotalSize = (DWORD)sizeofVarStringStruct;
            lreturn = lineGetID( 0, 0, (HCALL)m_dwDevice, LINECALLSELECT_CALL, lpVarStringStruct, "comm/datamodem" );
        } while( lreturn != 0 );
        //
        // get comm device handle and save it to properties area
        m_hComm = *( (LPHANDLE )( ( LPBYTE )lpVarStringStruct + lpVarStringStruct->dwStringOffset ) );

        COMMTIMEOUTS CommTimeOuts;
        CommTimeOuts.ReadIntervalTimeout            =    5000;
        CommTimeOuts.ReadTotalTimeoutMultiplier        =    5000;
        CommTimeOuts.ReadTotalTimeoutConstant        =    5000;
        CommTimeOuts.WriteTotalTimeoutMultiplier    =    5000;
        CommTimeOuts.WriteTotalTimeoutConstant        =    5000;
        SetCommTimeouts(m_hComm,&CommTimeOuts);

        //
        // tell main dialog we got through
        ::SendMessage(m_hWnd, WM_TAPI_CONNECT, TAPI_LINECALLSTATE_CONNECTED, (LPARAM)(HANDLE)m_hComm );
        LocalFree( lpVarStringStruct ); // drop mem space2:
    typedef struct tagModemID{
            HANDLE hModem;
            char ModemName[1];
    }ModemID;

    VARSTRING * str;
    LONG lid;
    DWORD size;
    char =1;
    ModemID *mid;
        
    str=(VARSTRING *)malloc(sizeof(VARSTRING));
    if(!str)     
    return NULL;
    str->dwTotalSize=sizeof(VARSTRING);
    do
    {     if((lineGetID(m_hLine,0,NULL,LINECALLSELECT_LINE,str,"comm/datamodem")==0)
    &&(str->dwTotalSize < str-> dwNeededSize))
    {     
    DWORD dwSize=str->dwNeededSize;
    free(str);
    str=(VARSTRING *)malloc(dwSize);
    if(!str)
    {
    m_hComm=NULL;
    =2;
    }
    str->dwTotalSize=dwSize;
    }
    else
    =0;
        }while(==1); if(==0)

    //m_hComm=(HANDLE)((LPSTR)str+str->dwStringOffset);
    mid=(ModemID*)((LPSTR)str+str->dwStringOffset);
    m_hComm=mid->hModem;
    } free(str);
    可用以上两种方法得到的句柄都读写串口不成功,也就是读不到数据,也写不出数据!
    有哪位大虾来帮我啊!!!!
      

  6.   

    这和你的lineOpen中打开线路的优先级(dwPrivilege)相关,如果是linecallprivilege_monitor/none的优先级,linegetid是得不到modem句柄的.
    你可以先Or上linecallprivilege_owner优先级再试试.退一步说,如果你的lineGetID检索到的modem句柄还是NULL,也不用怕,可以用它返回的Modem名字(CommID结构中第二个字段)传入CreateFile来直接打开Modem,用于Read/WriteFile.由于是modem不是磁盘文件,别忘记在这个名字前加上\\.\的前缀.
      

  7.   

    给你一个获取MODEM句柄的函数,你可以试试看。void CTapiConnection::GethModem(HLINE hLine)
    {  
    ModemID far *mid;
        VARSTRING * str;
    //    LONG lid;
        DWORD dwSize;
        char =1;
        str=(VARSTRING *)malloc(sizeof(VARSTRING));
        if(!str) return;
    if(!hLine)return ;
        str->dwTotalSize=sizeof(VARSTRING);
        do
        {
    if((lineGetID(hLine,0,NULL,LINECALLSELECT_LINE,str,"comm/datamodem")==0)&&(str->dwTotalSize>=str->dwNeededSize))
        {
    dwSize=str->dwNeededSize;
            free(str);
             str=(VARSTRING *)malloc(dwSize);
              if(!str)
            {
    myhModem=NULL;
    =2;
    }
    str->dwTotalSize=dwSize;
           }
    else =0;
        }while(==1);
    if(==0)
    {
    mid=(ModemID far *)((LPSTR)str+str->dwStringOffset);
        myhModem=mid->hModem;
    }
        free(str);
    }其中:
    typedef  struct tagModemID{
    HANDLE hModem;
        char ModemName[1];
    }ModemID;
      

  8.   

    hi,你的取法可能不对,看看我刚结的一个帖子:
    http://www.csdn.net/expert/topic/829/829405.xml?temp=.5950891
      

  9.   

    发给你了,用tapi在两个Modem间传数据的,调试通过。
      

  10.   

    我也在用这个东东,
    按上面的方法取得句柄是有效的,我用的是第二种方法,
    但使用句柄要在系统发出了LINECALLSTATE_CONNECTED以后!