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