用VB的拨号例子拨号一切正常,然后仿照VB的例子写了个C#的,但拨号没反映,部分拨号的代码:
D080A.PUSH_PLAY();
SHORT i=0;
IF(DO80A.CheckChType(i)==1)
{
  DO80A.OffHook(i);
  DO80A.SendDtmfBuf(i,"150*********");
}
上边代码执行完毕后后面的代码能检测到拨号以完毕但信号信检测函数返回的结果是没有任何信号音。同时手机也没反映
做过类似开发的请帮忙
语音卡是东进的模拟卡

解决方案 »

  1.   

    很早之前写的一个可以看一下:
     public delegate void FeedBackCall(bool bSuccess, string test);
        public class Call
        {
            public event FeedBackCall FeedBackCallHandle;
            public Call()
            { }        #region Variable && Struct
            private long m_LoadDriveFlag;
            //private short m_TotalLine;
            private LINESTRUCT[] m_Lines;
            private string sFilePath;
            private string sWelFile;
            private string sFeedbackFile;
            /// <summary>
            /// 找到第一条可用的线路
            /// </summary>
            short wUseLine = -1;
            //检测极性翻转
            private bool bSate1;
            private bool bSate2;        private Timer tim;        private struct LINESTRUCT
            {
                public CHANNEL_TYPE nType;
                public CHANNEL_STATE State;
                public string CallerID;
                public string Dtmf;
                public int nTimeElapse;
            }        /// <summary>
            /// The main entry point for the application.
            /// </summary>
            private enum CHANNEL_STATE : short
            {
                CH_FREE,
                CH_DIAL,
                CH_CHECKSIG,
                CH_BUSY,
                CH_NOSIGNAL,
                CH_NOBODY,
                CH_NODIALTONE,
                CH_CONNECT,
                CH_OFFHOOK,
                CH_PLAY,
                CH_ONHOOK,
                CH_FAIL
            }        private enum SIG_STATE : int
            {
                S_NODIALTONE = 0x0F,
                S_BUSY = 0x11,
                S_NOBODY = 0x13,
                S_CONNECT = 0x14,
                S_NOSIGNAL = 0x15,            S_DIALSIG = 0x30
            }        private enum CHANNEL_TYPE : short
            {
                User,
                Trunk,
                Empty
            }
            #endregion        #region InitiDriver
            public void IniDrv()
            {
                try
                {
                    m_LoadDriveFlag = Voice.LoadDRV();
                    if (m_LoadDriveFlag == 1)
                    {
                        throw new Exception("Load Voice Card Fail!");
                    }
                    short m_TotalLine = Voice.CheckValidCh();
                    m_Lines = new LINESTRUCT[m_TotalLine];
                    if (Voice.EnableCard(m_TotalLine, 8 * 512) == (long)1)
                    {
                        Voice.FreeDRV();
                        throw new Exception("Enable Card Fail!");
                    }                m_Lines = new LINESTRUCT[m_TotalLine];
                    for (short i = 0; i < m_TotalLine; i++)
                    {
                        m_Lines[i].State = CHANNEL_STATE.CH_FREE;
                        m_Lines[i].nType = (CHANNEL_TYPE)Voice.CheckChType(i);
                        m_Lines[i].CallerID = "";
                        m_Lines[i].Dtmf = "";
                        if (m_Lines[i].nType == CHANNEL_TYPE.Trunk)
                        {
                            wUseLine = i;
                            break;
                        }
                    }
                    if (wUseLine == -1)
                    {
                        Voice.FreeDRV();
                        throw new Exception("No active line!");
                    }                Voice.SetBusyPara((short)350);
                    Voice.Sig_Init(wUseLine);
                }
                catch (Exception ex)
                { 
                     string sMsg = string.Empty;
                     if (ex.Message.Contains("Tc08a32.dll"))
                     {
                         sMsg = "Load Voice Card Fail!";
                     }
                     else
                     {
                         sMsg = ex.Message;
                     }
                     throw new Exception(sMsg);
                }
            }
            #endregion        #region ChangeCode No.
            private string CvtDTMF(short DTMFCode)
            {
                char c;
                switch (DTMFCode)
                {
                    case 10:
                        c = '0';
                        break;
                    case 11:
                        c = '*';
                        break;
                    case 12:
                        c = '#';
                        break;
                    case 15:
                        c = (char)(DTMFCode - 13 + (short)'a');
                        break;
                    case 0:
                        c = 'd';
                        break;
                    default:
                        c = (char)(DTMFCode + (short)'0');//change DTMF from number to ASCII
                        break;
                }
                return c.ToString();        }
            #endregion
      

  2.   

     #region Reset Channel
            private void ResetChnl(short wChnlNo)
            {
                if (m_Lines[wChnlNo].nType == CHANNEL_TYPE.Trunk)
                {
                    Voice.HangUp(wChnlNo);
                    Voice.Sig_ResetCheck(wChnlNo);
                    Voice.StartSigCheck(wChnlNo);
                }
                m_Lines[wChnlNo].Dtmf = "";
                m_Lines[wChnlNo].CallerID = "";
                m_Lines[wChnlNo].State = CHANNEL_STATE.CH_FREE;
                //Voice.FreeDRV();
            }
            #endregion        #region Get Voice File Path
            private byte[] GetFilePath(string FileName)
            {
                char[] TmpFName = new char[128];
                byte[] FName = new byte[128];            string sFleName = sFilePath + "\\" + FileName;            sFleName.ToCharArray().CopyTo(TmpFName, 0);            short i = 0;            for (i = 0; i < sFleName.Length; i++)
                {
                    FName[i] = (byte)sFleName[i];
                }
                return FName;
            }
            #endregion        #region Start Play File
            private void StartPlayFileEx(short wChnlNo, string FileName)
            {
                byte[] FName = GetFilePath(FileName);            Voice.StartPlayFile(wChnlNo, FName, 0);
            }
            #endregion        #region DoWork        /// <summary>
            /// 记录录间播放的次数
            /// </summary>
            private int nCout = 0;
            private int nCheck = 0;
            private void DoWork()
            {
                Voice.PUSH_PLAY();
                Voice.FeedSigFunc();
                int tt;
                short TmpDTMF;
                switch (m_Lines[wUseLine].State) //state transfer
                {
                    case CHANNEL_STATE.CH_FREE:
                        break;
                    case CHANNEL_STATE.CH_DIAL:                    Voice.StartSigCheck(wUseLine);
                        m_Lines[wUseLine].State = CHANNEL_STATE.CH_CHECKSIG;                    break;
                    case CHANNEL_STATE.CH_CHECKSIG:                    tt = Voice.Sig_CheckDial(wUseLine);
                        #region average
                        if (tt == (short)SIG_STATE.S_BUSY)
                        {
                            m_Lines[wUseLine].State = CHANNEL_STATE.CH_FAIL;
                        }
                        else if (tt == (short)SIG_STATE.S_CONNECT)
                        {
                            m_Lines[wUseLine].State = CHANNEL_STATE.CH_CONNECT;
                        }
                        else if (tt == (short)SIG_STATE.S_NOSIGNAL)
                        {
                            m_Lines[wUseLine].State = CHANNEL_STATE.CH_FAIL;
                        }
                        else if (tt == (short)SIG_STATE.S_NOBODY)
                        {
                            m_Lines[wUseLine].State = CHANNEL_STATE.CH_FAIL;
                        }
                        else if (tt == (short)SIG_STATE.S_NODIALTONE)
                        {
                            m_Lines[wUseLine].State = CHANNEL_STATE.CH_FAIL;
                        }
                        #endregion                    //bSate2 = Voice.CheckPolarity(wUseLine);                    //nCheck++;
                        //if (bSate2 != bSate1)
                        //{
                        //    m_Lines[wUseLine].State = CHANNEL_STATE.CH_CONNECT;
                        //}
                        //if (nCheck == 600)
                        //{
                        //    m_Lines[wUseLine].State = CHANNEL_STATE.CH_FAIL;
                        //}
                        //FeedBackCallHandle(false, "bS1:"+bSate1.ToString()+"bS2"+bSate2.ToString());
                        break;
                    case CHANNEL_STATE.CH_CONNECT:                    Voice.InitDtmfBuf(wUseLine);
                        StartPlayFileEx(wUseLine, sWelFile);
                        m_Lines[wUseLine].State = CHANNEL_STATE.CH_PLAY;
                        break;
                    case CHANNEL_STATE.CH_OFFHOOK:                    StartPlayFileEx(wUseLine, sWelFile);
                        m_Lines[wUseLine].State = CHANNEL_STATE.CH_PLAY;
                        break;
                    case CHANNEL_STATE.CH_PLAY:
                        TmpDTMF = Voice.GetDtmfCode(wUseLine);                    if (TmpDTMF == 1)
                        {
                            Voice.StopPlayFile(wUseLine);
                            m_Lines[wUseLine].State = CHANNEL_STATE.CH_ONHOOK;
                            StartPlayFileEx(wUseLine, sFeedbackFile);
                        }
                        if (Voice.CheckPlayEnd(wUseLine))
                        {
                            nCout++;
                            //DoFeedBackCall(false, nCout.ToString());
                            if (nCout == 5)
                            {
                                Voice.StopPlayFile(wUseLine);
                                m_Lines[wUseLine].State = CHANNEL_STATE.CH_FAIL;
                            }
                            Voice.StopIndexPlayFile(wUseLine);
                            StartPlayFileEx(wUseLine, sWelFile);
                        }
                        break;
                    case CHANNEL_STATE.CH_ONHOOK:
                        if (Voice.CheckPlayEnd(wUseLine))
                        {
                            ResetChnl(wUseLine);
                            DoFeedBackCall(true, "Success");
                        }
                        break;
                    case CHANNEL_STATE.CH_FAIL:
                        ResetChnl(wUseLine);
                        DoFeedBackCall(false, "fail");
                        break;
                }        }
            #endregion        private void DoFeedBackCall(bool bState, string msg)
            {
                if (FeedBackCallHandle != null)
                    FeedBackCallHandle(bState, msg);
            }
      

  3.   

     #region Dial
            public void Dial(short wChan, string sPer, string sNo)
            {
                try
                {
                    sNo += ",,," + sNo;
                    Voice.OffHook(wUseLine);                nCout = 0;
                    nCheck = 0;
                    short sMode;
                    if (sNo.Length > 5)
                    {
                        sMode = 0;
                    }
                    else
                    {
                        sMode = 1;
                    }
                    Voice.Sig_StartDial(wUseLine, System.Text.Encoding.Default.GetBytes((sNo).ToCharArray()), System.Text.Encoding.Default.GetBytes((sPer).ToCharArray()), sMode);
                    m_Lines[wUseLine].State = CHANNEL_STATE.CH_DIAL;
                    bSate1 = Voice.CheckPolarity(wUseLine);
                    tim = new Timer();
                    tim.Interval = 100;
                    tim.AutoReset = true;
                    tim.Elapsed += new ElapsedEventHandler(ElapsedHandler);
                    tim.Enabled = true;
                    tim.Start();            }
                catch
                {
                    //tim.Stop();
                    if (tim != null)
                        tim.Enabled = false;
                    Voice.FreeDRV();
                }
            }
            #endregion        private void ElapsedHandler(object sender, ElapsedEventArgs e)
            {
                DoWork();
            }        #region FreeDrv
            public void FreeDrv()
            {
                try
                {
                    if (tim != null)
                    {
                        tim.Stop();
                        tim.Enabled = false;
                    }                if (wUseLine > -1 && m_Lines[wUseLine].nType == CHANNEL_TYPE.Trunk)
                    {
                        Voice.StopPlay((short)wUseLine);
                        Voice.HangUp((short)wUseLine);
                    }
                    Voice.DisableCard();
                    Voice.FreeDRV();
                }
                catch
                { }
            }
            #endregion        #region Attribute
            /// <summary>
            /// The Voice Save Path
            /// </summary>
            public string VoiceFilePath
            {
                get { return sFilePath; }
                set { sFilePath = value; }
            }
            /// <summary>
            /// Play Welcome Voice File
            /// </summary>
            public string WelcomeVoiceFile
            {
                get { return sWelFile; }
                set { sWelFile = value; }
            }
            /// <summary>
            /// Play FeedBack Ok Voice File
            /// </summary>
            public string FeedbackVoiceFile
            {
                get { return sFeedbackFile; }
                set { sFeedbackFile = value; }
            }
            #endregion    }    #region Struct
        public struct TC_INI_TYPE
        {
            public short wCardNo;
            public short wCardType;
            public short wConnect;
            public short wIRQ;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] cbDir;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public short[] wAddress;
            public short wMajorVer;
            public short wMinorVer;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public short[] wChType;    }
        public struct TC_INI_TYPE_MORE
        {
        }
        #endregion
      

  4.   

    csdn 上有例子 东进的模拟卡 你可以参考下
      

  5.   

    拨号问题解决了,用的API里面新的拨号和信号音检测函数。SendDtmfBuf()这个函数始终不行。。但接受按键又出问题,有时候能接受到,但大部分情况下接受不到,函数返回的值是缓存中按键为空