通信程序设计实习报告.docx
- 文档编号:13589495
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:13
- 大小:20.66KB
通信程序设计实习报告.docx
《通信程序设计实习报告.docx》由会员分享,可在线阅读,更多相关《通信程序设计实习报告.docx(13页珍藏版)》请在冰点文库上搜索。
通信程序设计实习报告
通信工程程序设计实习报告
经过为期十天的通信实习,我认识到了很多程序设计方面的东西,也学到了很多专业方面的知识。
从一开始上课时,我初步了解到了这几天的程序设计实习到底该做些什么,要做到什么样的程度,有些什么样的要求和内容。
在老师所提供的几个选题中我们小组选择了现阶段使用的较多的语音查询系统“10086”,来进行我们的设计。
第一天实习,是比较手忙脚乱的,也是毫无头绪的,都是没头苍蝇乱撞。
鉴于第一次在机房里头旁边还有个电话机,我还是有点小激动的,首先便把东进语音卡小玩了一下。
平常编程时,编的都是一些比较小的程序,只是些简单的算法。
在编语音卡程序时,我发现平常我们所学的东西好像实用性非常差,我的实践能力的缺乏。
花了一天的时间,我就了解了一下语音卡使用的一部份内容,着重练习了MFC控件的使用。
主要学习了如何添加按钮框,怎样实现点击按钮之后的内容的显示,以及按钮之间的内容的传递等。
这一天的程序设计实习让我非常的担忧,我感觉我会的东西实在太少了,实在是不足以驾驭这样的实习,不过见大家都是这样,心情也没有那么差。
之后,我们便做了语音卡的放音,一开始我们先自己试着做,但是实在是由于对这个东西的了解太少了,搞了半天也实在是不知道从何处下手。
然后我就试着从老师所给的语音卡实习指导书和DBDK编程参考手册中寻找解决方法,遇到不知道的问题或者不明白的东西就XX或者询问老师,开始我们找到了BOOLWINAPIStartPlayFile(WORDwChnlNo,LPSTRFileName,DWORDStartPos)这个函数,但是对于函数的参数不了解,介于当时没有讲List,所以对于这样一个函数还是不知道从何下手的,上网XX后也没有找到比较好的讲解,正当我们手足无措的时候,老师给我们发过来一个示例,我们试运行了,直观地了解到了这个程序的功能。
不过在运行时并没有直接的听到放音的效果,这下子又有点懵了,老师运行的时候明明是好的,怎么到了我们这儿就不行了呢?
试了几次依然是什么声音都没有,我们便又开始寻找原因,对照函数看函数中的各个参数的意义,在看到通道号的时候,我们看了会儿才知道原来是通道号错了,是我们的通道号和老师所使用的机子不一样导致的,之后我们修改了,便运行正常。
当时感觉就是轻松啊,就一个放音就折腾了我们这么长时间,实在是令人费解。
在这个过程中使用到的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键。
所以我们可以用这样的函数来进行转换:
charCMy2Dlg:
:
ConvertDTMF(intch)
{
charc;
switch(ch)
{
case10:
c='0';
break;
case11:
c='*';
break;
case12:
c='#';
break;
case13:
case14:
case15:
c=ch-13+'a';
break;
case0:
c='d';
break;
default:
c=ch+'0';//changeDTMFfromnumbertoASCII
}
returnc;
}
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++使用的形式才可以。
在匹配密码时编写这样的函数来获取数据库中的密码:
CStringCMy2Dlg:
:
getmima(CStringss)
{variant_tvar;
//CStringstrName,strAge;
CStringSQL,str;
str="";
inthh=0;
char*STRSQL;
//SQL="SELECT*FROMphoneWHEREphonenum='"+shoujih+"'andpassword='"+mima+"'";//'"+shoujih+"'"
SQL="SELECT*FROMphoneWHEREphonenum='"+ss+"'";
STRSQL=SQL.GetBuffer(SQL.GetLength());
//AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=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());
}
returnstr;
}
同样以后的话费,余额中也是如此。
只有这样才能将数据库中存储的字符串转换成程序中所要使用到的字符形式。
当我们将密码从数据库中取出来,我们要做的就是将密码与相对应的号码进行匹配,从而进行下一步的操作,从相应的号码中取出相应的话费及余额的值提供给用户。
密码匹配的程序代码如下:
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).如何将从数据库中取出来的书拆分成一个个的数字
case20:
m=atoi(str2);
if(m>=100)n=1;
elseif(m>=10)n=2;
elsen=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;
case26:
m=atoi(str3);
if(m>=100)n=1;
elseif(m>=10)n=2;
elsen=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”按照人们的习惯读通顺)
case21:
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;
case22:
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;
case23:
if(CheckPlayEnd(m_ValidCh))
{StopPlayFile(m_ValidCh);
m_ChState=24;}
break;
case24:
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;
case25:
if(CheckPlayEnd(m_ValidCh))
{StopPlayFile(m_ValidCh);m_ChState=21;}
if(n==5){m_ChState=5;n=1;}
break;
case5:
if(CheckPlayEnd(m_ValidCh))
{
StopPlayFile(m_ValidCh);
m_ChState=8;
}
break;
2.如果用户没有听清楚,我们该怎么办?
当用户没有听清楚时可以要求系统重新读一遍,以满足用户的需求。
免得用户重新拨打浪费时间。
在用户听完后,我们可以再放一段提示音,然后收号,当code==12时,我们则将m_ChState=22。
这样就能够重新来读一遍了。
3.如何让用户选择自己所需要收听的内容,话费还是余额?
while((code=GetDtmfCode(m_ValidCh))!
=-1)
{
Dtmf[len++]=ConvertDTMF(code);
m_List1.SetItemText(m_ValidCh,2,"收号");
if(code==1)
{
m_ChState=4;
i=4;
break;
}
elseif(code==2)
{
m_ChState=6;
i=6;
break;
}
elseif(code==3)
{
m_ChState=7;
i=7;
break;
}
4.当用户收听完毕之后,我们该是提示用户接下来该返回到上一层菜单,还是什么也不说直接断线?
按照客户服务热线对用户提供的比较人性化的服务,我们必须做到更加友好的界面。
程序如下:
while((code=GetDtmfCode(m_ValidCh))!
=-1)
{
m_List1.SetItemText(m_ValidCh,2,"收号");
if(code==11)
{
m_ChState=12;
}
elseif(code==12)
{
m_ChState=i;
}
elseif(code==10)
{
StartPlayFile(m_ValidCh,"xiexie",0L);
m_List1.SetItemText(m_ValidCh,2,"感谢");
}
Dtmf[len]=0;
break;
}
做到这儿,我们已经做的差不多了,只是有点小问题需要自己来修正一下。
在这次通信程序设计实习中,我学到了很多东西,在这次设计实习中,我充分的将大一所学的C语言和C++结合到实际的应用中,在平常学习的基础上有了更深的了解和更加清晰的认识,不再像平常上课时的实验题那样针对性强,而是更加综合,更加要求我对所学内容的整合以及联系,这样会得到更加好的锻炼。
通过这次在学校里的语音卡的实习,让我对通信这门专业有了稍微具体直观地认识,也会对我以后职业道路的专业知识以及实战经验方面的积累起到很大的作用。
在这次实习中,我在遇到不会的问题以及记得不太清楚的问题时,就及时地想办法解答问题,这样对于知识的了解及消化有着相当好的帮助,能让自己更加好的掌握有关的知识。
这次专业实习不仅让我体会到团队精神的重要性,更让我对自己所要学习的专业有了更加清醒地认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通信 程序设计 实习 报告