通信程序设计实习报告.doc_第1页
通信程序设计实习报告.doc_第2页
通信程序设计实习报告.doc_第3页
通信程序设计实习报告.doc_第4页
通信程序设计实习报告.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通信工程程序设计实习报告 经过为期十天的通信实习,我认识到了很多程序设计方面的东西,也学到了很多专业方面的知识。从一开始上课时,我初步了解到了这几天的程序设计实习到底该做些什么,要做到什么样的程度,有些什么样的要求和内容。在老师所提供的几个选题中我们小组选择了现阶段使用的较多的语音查询系统“10086”,来进行我们的设计。第一天实习,是比较手忙脚乱的,也是毫无头绪的,都是没头苍蝇乱撞。鉴于第一次在机房里头旁边还有个电话机,我还是有点小激动的,首先便把东进语音卡小玩了一下。平常编程时,编的都是一些比较小的程序,只是些简单的算法。在编语音卡程序时,我发现平常我们所学的东西好像实用性非常差,我的实践能力的缺乏。花了一天的时间,我就了解了一下语音卡使用的一部份内容,着重练习了mfc控件的使用。主要学习了如何添加按钮框,怎样实现点击按钮之后的内容的显示,以及按钮之间的内容的传递等。这一天的程序设计实习让我非常的担忧,我感觉我会的东西实在太少了,实在是不足以驾驭这样的实习,不过见大家都是这样,心情也没有那么差。之后,我们便做了语音卡的放音,一开始我们先自己试着做,但是实在是由于对这个东西的了解太少了,搞了半天也实在是不知道从何处下手。然后我就试着从老师所给的语音卡实习指导书和dbdk编程参考手册中寻找解决方法,遇到不知道的问题或者不明白的东西就百度或者询问老师,开始我们找到了bool winapi startplayfile ( word wchnlno, lpstr filename, dword startpos )这个函数,但是对于函数的参数不了解,介于当时没有讲list,所以对于这样一个函数还是不知道从何下手的,上网百度后也没有找到比较好的讲解,正当我们手足无措的时候,老师给我们发过来一个示例,我们试运行了,直观地了解到了这个程序的功能。不过在运行时并没有直接的听到放音的效果,这下子又有点懵了,老师运行的时候明明是好的,怎么到了我们这儿就不行了呢?试了几次依然是什么声音都没有,我们便又开始寻找原因,对照函数看函数中的各个参数的意义,在看到通道号的时候,我们看了会儿才知道原来是通道号错了,是我们的通道号和老师所使用的机子不一样导致的,之后我们修改了,便运行正常。当时感觉就是轻松啊,就一个放音就折腾了我们这么长时间,实在是令人费解。在这个过程中使用到的list控件,在对于updatedata中的返回值及其含义在第一天的实习中我们就已经有了些许的了解。当返回值为true时,表示将控件的内容保存到变量中;当返回值为false时,表示将表示将变量的内容保存到控件中。当然在这个放音的制作过程当中,我们也运用到了列表框,这使得编写程序变得简单,而且很多功能也易于实现,显得更加简洁,这样会使得整个界面更加人性化。在做语音卡放音的整个过程中,我们还遇到了一些比较重要的问题。1. 如何收号?通过如下这样的一个函数来收号,前面的getdtmfcode()函数的返回值是-1和116之间的数字,当有号收进去之后,则while判断成立,就继续进行下一个数字的录入,否则依然播放提示音要求用户的输入。while(code=getdtmfcode(m_validch)!=-1)dtmflen+=convertdtmf(code);m_list1.setitemtext(m_validch,2,收号);2. 收号之后在计算机中的存储与识别问题?计算机中数字的存储是用ascii码值来表示的,所以我们需要用到函数来进行数值的转换,以适应计算机的运行要求。因为getdtmfcode()函数的返回值是这样表示的: 19:19键。 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 asciireturn c;3. dtmf缓存区的清空的相关问题?在每次收号的时候都要做到对dtmf缓存区的清空,只有这样才能准确的判断到底收了几位数,以便程序作出正确的响应,而不至于是程序无法进行。还有就是dtmf缓存区他也有一定的长度,如果输入的数字过多,会导致在列表框里显示的时候,出现数字的乱码等问题,不能达到预期的结果。4. 如何做到按键的时候停止语音的播放?我们可以设置在用户输入一个数字的时候则停止语音的播放,可以用if语句来判断,如果dtmf的长度大于0,则停止语音的播放,但是收号继续,当收号的长度达到指定之时,则继续下一阶段的提示音的播放。5. 用户摘机之后电话需要做出什么样的反应?只是我们会使用到offhookdetect()函数,当函数返回值为0时,表明用户未摘机,此时继续发送振铃音;若函数返回值为1,表明用户摘机,就停止对用户发送振铃音。然后则开始10086客户服务热线的欢迎词以及相关服务的提示音。做完这个之后,我们便开始着手下一步的操作。当输入手机号码时,我们便会需要匹配,来确认数据库中是否有这样的手机号码,以防在接下来的操作中做无用功。遇到这样的问题,在一年的学习中,老师进场在一些这类的问题中提到数据库的使用,理所当然,我们首先想到的便是使用数据库,但是说会说,对数据库这个东西的使用确实不会的,所以我们便想到了数组,毕竟这东西是老生常谈的了。我们开始建立了个haoma12的数组,只是做了个最简单的只匹配一个手机号码的程序,用strcmp(dtmf,haoma)进行比较,当函数值为零时,则提示输入密码,并进行密码的匹配,否则用m_chstate继续回到上一步。程序如下:if(strcmp(haoma,dtmf)=0)startplayfile(m_validch,shurumima,0l);m_chstate=18;strcpy(mima,);elsestrcpy(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; 当我们做完密码的匹对之后,我们便开始着手下一步的操作,将话费和余额通过语音读出来呈现给用户。这中间有涉及到几个比较重要的问题:1. 如何将话费和余额读出来?我们先用东进语音卡录入语音,然后将话费和余额读出来。这中间又会遇到两个问题:(1).如何将数据库中的数转换成为适合vc+的形式我们可以适应atoi函数进行转换,从而进行编辑。(2).如何将从数据库中取出来的书拆分成一个个的数字case 20:m=atoi(str2); if(m=100) n=1; else if(m=10) n=2;else n=3;if(m=0)startplayfile(m_validch,0,0l);m_chstate=24;a=m/100;b=(m-a*100)/10;c=(m-a*100-b*10); m_chstate=21;break;case 26:m=atoi(str3); if(m=100) n=1; else if(m=10) n=2;else n=3;if(m=0)startplayfile(m_validch,0,0l);m_chstate=24;a=m/100;b=(m-a*100)/10;c=(m-a*100-b*10); m_chstate=21;break;(3).如何将数字按照人们的读数习惯读出来?(主要是解决如何将数值中存在的“0”按照人们的习惯读通顺)case 21:if(n=1) k=a;if(n=2) k=b;if(n=3) k=c; m_chstate=22;if(n=4) m_chstate=24;break;case 22: if(k=0&c!=0&b!=0)|(k=0&c!=0) startplayfile(m_validch,0,0l); /解决个位数十位数均为零和只有个位数为零时的读数问题 if(k=1) startplayfile(m_validch,1,0l); if(k=2) startplayfile(m_validch,2,0l); if(k=3) startplayfile(m_validch,3,0l); if(k=4) startplayfile(m_validch,4,0l); if(k=5) startplayfile(m_validch,5,0l); if(k=6) startplayfile(m_validch,6,0l); if(k=7) startplayfile(m_validch,7,0l); if(k=8) startplayfile(m_validch,8,0l); if(k=9) startplayfile(m_validch,9,0l); m_chstate=23; break; case 23: if(checkplayend(m_validch) stopplayfile(m_validch);m_chstate=24; break;case 24: if(n=1)startplayfile(m_validch,百,0l); if(n=2&b!=0)startplayfile(m_validch,十,0l);/解决十位数为零的读数问题 if(n=3)startplayfile(m_validch,元,0l); if(n=4)startplayfile(m_validch,结束语,0l); n+; m_chstate=25; break;case 25: if(checkplayend(m_validch) stopplayfile(m_validch);m_chstate=21; if(n=5) m_chstate=5;n=1; break; case 5: if(checkplayend(m_validch)stopplayfile(m_validch);m_chstate=8;break;2. 如果用户没有听清楚,我们该怎么办?当用户没有听清楚时可以要求系统重新读一遍,以满足用户的需求。免得用户重新拨打浪费时间。在用户听完后,我们可以再放一段提示音,然后收号,当code=12时,我们则将m_chstate=22。这样就能够重新来读一遍了。3. 如何让用户选择自己所需要收听的内容,话费还是余额? while(code=getdtmfcode(m_validch)!=-1) dtmflen+=convertdtmf(code);m_list1.setitemtext(m_validch,2,收号);if(code=1) m_chstate=4;i=4; break;else if(code=2) m_chstate=6; i=6; break;else if(code=3)m_chstate=7;i=7;break;4.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论