当前位置:文档之家› 通信程序设计实习报告

通信程序设计实习报告

通信工程程序设计实习报告经过为期十天的通信实习,我认识到了很多程序设计方面的东西,也学到了很多专业方面的知识。

从一开始上课时,我初步了解到了这几天的程序设计实习到底该做些什么,要做到什么样的程度,有些什么样的要求和内容。

在老师所提供的几个选题中我们小组选择了现阶段使用的较多的语音查询系统“10086”,来进行我们的设计。

第一天实习,是比较手忙脚乱的,也是毫无头绪的,都是没头苍蝇乱撞。

鉴于第一次在机房里头旁边还有个电话机,我还是有点小激动的,首先便把东进语音卡小玩了一下。

平常编程时,编的都是一些比较小的程序,只是些简单的算法。

在编语音卡程序时,我发现平常我们所学的东西好像实用性非常差,我的实践能力的缺乏。

花了一天的时间,我就了解了一下语音卡使用的一部份内容,着重练习了MFC控件的使用。

主要学习了如何添加按钮框,怎样实现点击按钮之后的内容的显示,以及按钮之间的内容的传递等。

这一天的程序设计实习让我非常的担忧,我感觉我会的东西实在太少了,实在是不足以驾驭这样的实习,不过见大家都是这样,心情也没有那么差。

之后,我们便做了语音卡的放音,一开始我们先自己试着做,但是实在是由于对这个东西的了解太少了,搞了半天也实在是不知道从何处下手。

然后我就试着从老师所给的语音卡实习指导书和DBDK编程参考手册中寻找解决方法,遇到不知道的问题或者不明白的东西就百度或者询问老师,开始我们找到了BOOL WINAPI StartPlayFile ( WORD wChnlNo, LPSTR FileName, DWORD StartPos )这个函数,但是对于函数的参数不了解,介于当时没有讲List,所以对于这样一个函数还是不知道从何下手的,上网百度后也没有找到比较好的讲解,正当我们手足无措的时候,老师给我们发过来一个示例,我们试运行了,直观地了解到了这个程序的功能。

不过在运行时并没有直接的听到放音的效果,这下子又有点懵了,老师运行的时候明明是好的,怎么到了我们这儿就不行了呢?试了几次依然是什么声音都没有,我们便又开始寻找原因,对照函数看函数中的各个参数的意义,在看到通道号的时候,我们看了会儿才知道原来是通道号错了,是我们的通道号和老师所使用的机子不一样导致的,之后我们修改了,便运行正常。

当时感觉就是轻松啊,就一个放音就折腾了我们这么长时间,实在是令人费解。

在这个过程中使用到的List控件,在对于UpdateData中的返回值及其含义在第一天的实习中我们就已经有了些许的了解。

当返回值为TRUE时,表示将控件的内容保存到变量中;当返回值为FALSE时,表示将表示将变量的内容保存到控件中。

当然在这个放音的制作过程当中,我们也运用到了列表框,这使得编写程序变得简单,而且很多功能也易于实现,显得更加简洁,这样会使得整个界面更加人性化。

在做语音卡放音的整个过程中,我们还遇到了一些比较重要的问题。

1.如何收号?通过如下这样的一个函数来收号,前面的GetDtmfCode()函数的返回值是-1和1——16之间的数字,当有号收进去之后,则while判断成立,就继续进行下一个数字的录入,否则依然播放提示音要求用户的输入。

while((code=GetDtmfCode(m_ValidCh))!=-1){Dtmf[len++]=ConvertDTMF(code);m_List1.SetItemText(m_ValidCh,2,"收号");}2.收号之后在计算机中的存储与识别问题?计算机中数字的存储是用ASCII码值来表示的,所以我们需要用到函数来进行数值的转换,以适应计算机的运行要求。

因为GetDtmfCode()函数的返回值是这样表示的:1~9:1~9键。

10:0 键。

11:*键。

12:#键。

13:A 键。

14:B键。

15:C键。

16:D 键。

所以我们可以用这样的函数来进行转换:char CMy2Dlg::ConvertDTMF(int ch){char c;switch(ch){case 10:c = '0';break;case 11:c = '*';break;case 12:c = '#';break;case 13:case 14:case 15:c=ch-13+'a';break;case 0:c='d';break;default:c = ch + '0';//change DTMF from number to ASCII}return c;}3.DTMF缓存区的清空的相关问题?在每次收号的时候都要做到对Dtmf缓存区的清空,只有这样才能准确的判断到底收了几位数,以便程序作出正确的响应,而不至于是程序无法进行。

还有就是Dtmf缓存区他也有一定的长度,如果输入的数字过多,会导致在列表框里显示的时候,出现数字的乱码等问题,不能达到预期的结果。

4.如何做到按键的时候停止语音的播放?我们可以设置在用户输入一个数字的时候则停止语音的播放,可以用if语句来判断,如果Dtmf的长度大于0,则停止语音的播放,但是收号继续,当收号的长度达到指定之时,则继续下一阶段的提示音的播放。

5.用户摘机之后电话需要做出什么样的反应?只是我们会使用到OffHookDetect()函数,当函数返回值为0时,表明用户未摘机,此时继续发送振铃音;若函数返回值为1,表明用户摘机,就停止对用户发送振铃音。

然后则开始10086客户服务热线的欢迎词以及相关服务的提示音。

做完这个之后,我们便开始着手下一步的操作。

当输入手机号码时,我们便会需要匹配,来确认数据库中是否有这样的手机号码,以防在接下来的操作中做无用功。

遇到这样的问题,在一年的学习中,老师进场在一些这类的问题中提到数据库的使用,理所当然,我们首先想到的便是使用数据库,但是说会说,对数据库这个东西的使用确实不会的,所以我们便想到了数组,毕竟这东西是老生常谈的了。

我们开始建立了个haoma[12]的数组,只是做了个最简单的只匹配一个手机号码的程序,用strcmp(Dtmf,haoma)进行比较,当函数值为零时,则提示输入密码,并进行密码的匹配,否则用m_ChState继续回到上一步。

程序如下:if(strcmp(haoma,Dtmf)==0){StartPlayFile(m_ValidCh,"shurumima",0L);m_ChState=18;strcpy(mima,"");}else{strcpy(mima,"");m_ChState=19;}但是鉴于在实际使用中的电话号码不可能只有这么一点点,所以我们必须要导入数据库,将程序与数据库连接,通过数据库来实现号码与密码的匹配,这样才能大量的减少代码,提高代码的利用率,不至于拖沓冗长。

在实验过程中我们连接的是Access数据库,所以我们在程序编写的时候需要添加文件的打开命令,使我们能够在匹配密码时进入数据库调用。

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=myphone. mdb","","",adModeUnknown);。

但是我们在导入数据库之后,并不是说我们就能够直接运用数据库里面的数,我们还需要将数据库里面的数取出来,并且转换成适合vc++使用的形式才可以。

在匹配密码时编写这样的函数来获取数据库中的密码:CString CMy2Dlg::getmima(CString ss){variant_t var;//CString strName,strAge;CString SQL,str;str="";int hh=0;char*STRSQL;//SQL="SELECT * FROM phone WHERE phonenum='"+shoujih+"'and password='"+mima+"'";//'"+shoujih+"'"SQL="SELECT * FROM phone WHERE phonenum='"+ss+"'";STRSQL=SQL.GetBuffer(SQL.GetLength());//AfxOleInit();m_pConnection.CreateInstance(__uuidof(Connection));try{m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=myphone.mdb","","",adModeUnknown);m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(STRSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);while(!m_pRecordset->adoEOF){//hh=1;var = m_pRecordset->GetCollect(_T("mima"));if(var.vt!=VT_NULL){str= (LPCTSTR)_bstr_t(var);}m_pRecordset->MoveNext();}m_pRecordset->Close();m_pRecordset = NULL;if(m_pConnection->State)m_pConnection->Close();m_pConnection= NULL;}catch(_com_error *e){AfxMessageBox(e->ErrorMessage());}return str;}同样以后的话费,余额中也是如此。

只有这样才能将数据库中存储的字符串转换成程序中所要使用到的字符形式。

当我们将密码从数据库中取出来,我们要做的就是将密码与相对应的号码进行匹配,从而进行下一步的操作,从相应的号码中取出相应的话费及余额的值提供给用户。

密码匹配的程序代码如下:js=getmima(Dtmf);if(strcmp(mima,js)==0) //字符串比较是否相等,进行密码的匹配{m_List1.SetItemText(m_ValidCh,2,"密码匹配上了");m_ChState=18;strcpy(mima,"");}else{m_List1.SetItemText(m_ValidCh,2,"密码不存在");strcpy(mima,"");m_ChState=19;}当我们做完密码的匹对之后,我们便开始着手下一步的操作,将话费和余额通过语音读出来呈现给用户。

相关主题