最大线路数,linestate为当前线路状态,linestate10为10ms前的线路状态,change为状态改变,fchange为首次变化,pulsenum为脉冲计数数组。 3.4.3主要的数据结构: 头文件:\以下的数据结构都已在该文件中定义) LINEMAX :最大线路数;
int linestate[LINEMAX],linestate10[LINEMAX]:线路从0开始编号;状态:1:有电流,0无电流;
int change[LINEMAX]:线路状态变化数组,0表示无变化,1表示有变化;
int fchange[LINEMAX]:线路首次变化数组,1表示已发生首次变化,0表示没有; int pulsenum[LINEMAX]:线路当前的脉冲值; 为方便操作,实验提供了两个预定义的函数:
int nor_op(int a,int b);int or_op(int a,int b);分别用于异或操作和或操作。 2.5实验流程及代码:
图三 脉冲检测流程图 实验代码:
#include \
31
int nor_op(int a,int b); int or_op(int a,int b);
extern \ _declspec(dllexport) void scanpulse(int linestate10[LINEMAX],int change[LINEMAX],int pulsenum[LINEMAX]) { int i; for(i=0;i 2.6 结论或总结 linestate[LINEMAX],int fchange[LINEMAX],int 1、连接运行上述程序,拨打电话时能够正常打通,说明所编的脉冲计数程序正确。 2、在程控交换系统中,脉冲计数是很重要是部分,号码的获取和脉冲计数直接相关,如果脉冲计数错误,将直接导致电话通信的失败。 3、脉冲计数实验实现的是一个8ms脉冲检测的周期级扫描,如果该函数的实现为空的话,即使位间隔识别的函数编写正确,在拨号音的情况下点击号码产生的脉冲也不能识别,从而使主叫进程得不到一个“送”上来的号码而导致拨号音超时,导致听到忙音。 4、在实验过程中,要把这次的线路状态值保存到10ms前的线路状态数组中,以便主程序周期调用。 5、我仍然遇到了上个实验的情况,并不是每次都能打通电话,更加增加了软件本身问题的可能性。 3.位间隔识别实验 3.1实验的目的与要求 增强对为间隔识别原理的掌握。 3.2实验原理 位间隔识别的目的是要识别两位号码之间的间隔,从而区分各位号码。首先来确定一下位间隔识别的扫描周期,一方面拨号盘的位间隔 ≥ 250ms,另一方面需要确定一下最长的脉冲或者间隔为多少毫秒。由于最慢的脉冲速度为每秒8个脉冲,这就是说脉冲周期T=1000/8=125ms,当断续比为3:1时,脉冲(断)时间应为125ms*3/4=93.75ms,所以位间 32 隔识别程序要能鉴别93.75ms和250ms间的间隔。一般采用96ms扫描程序来识别,位间隔识别的原理图: 图四 位间隔识别原理图 1)识别在前96ms周期内没有发生过变化。这就排除了脉冲变化的因素。因为脉冲最长间隔如前面所计算的那样为93.75ms〈 96ms; 2)识别出在此以前的最后一次变化是在96ms以前的那个周期内,这一条件可以保证在位间隔开始96ms后的第一个周期就能识别到,而且保证以后各次扫描不识别。 为此引入了“首次变化”这个变量,它标志首次遇到了“变化”。平时它为“0”,当在一个扫描周期内遇到变化后就变为“1”,在这个周期的后续时间里它都保持“1”不变。这个条件可由下面的逻辑关系来实现: 首次变化=首次变化∨变化识别。当首次变化为“0”时,只要8ms脉冲扫描的变化识别为“0”,则首次变化永远为“0”,一旦变化识别为“1”,则首次变化就变为“1”,而且以后无论变化识别如何改变都不能改变首次变化的“1”值。为确保以上“首次变化”平时为“0”,令每次96ms程序都把它清“0”,这样就写出下面的计算公式:首次变化=(首次变化∨变化识别)∧ /96 在每次96ms程序执行期间来检查“首次变化”这个变量,若为“0”,说明在前96周期内没有发生过变化;若为“1”,说明已发生变化,但这时还不能确定为何种变化,既可能为脉冲变化,也可能为位间隔变化。这就需要看下一个96ms周期,若仍有变化,则属于“脉冲变化”;若无变化,即属于“位间隔”变化(>96ms无变化)。这时在再下一个周期内仍能识别出“无变化”,但已经识别出一次了,不能再作重复识别。 33 对上面的讨论加以概括,只要识别两个变量就可以了:(1)上一个96ms周期内无变化;(2)再上一个周期内有变化就可确定为“位间隔”了。在上面的图中的“首次变化”是识别变量(1)的,首次变化=1是说明上一周期内无变化,否则有变化。上图中前次“首次变化”是识别后一个变量(2)的,前次“首次变化”是读取“首次变化”的存储内容,不过96ms读一次,读的正是再上一个周期的最后结果。前次“首次变化”=1,说明再上一个周期有过变化,否则无变化。将“首次变化”取反后与前次“首次变化”相与,结果为“1”,表示有位间隔。 值得注意的是,仅上面识别出的“位间隔”还是不够的,因为它只能说明前一次变化在96ms以前,那么用户中途挂机也可以达到这个条件,因此必须区别是“位间隔”还是“中途挂机”。区别这个很容易,只要区别一下现在用户处于挂机还是摘机状态就可以了。前者是中途挂机,后者是位间隔。方法可以是查一下当前的用户线状态,如果为“1”,说明用户已经挂机,那么识别的是“中途挂机”,否则为“位间隔”。 实验主体流程图: 图五 位间隔识别实验流程图 2.实验程序代码 34 ##include \#include \#include \ extern \linestate100[LINEMAX],int pulsenum[LINEMAX],int fchange[LINEMAX],int lfchange[LINEMAX],Digitnode*head2,Digitnode* end2) { int i,j; Digitnode *p;//号码接收队列节点指针 for(i=0;i if( lfchange[i]&& !fchange[i] &&linestate100[i] )//判断是否为位间隔识别将其入队列 { p=(Digitnode *)malloc(sizeof(Digitnode));//为指针申请空间 p->num=pulsenum[i];//将号码值放入队列 p->linenum=i;//将线路号放入队列 p->next=NULL; //单链表生成及节点插入 if (head2== NULL) head2= p; else end2 -> next = p; end2 = p; pulsenum[i]=0;//将该线路脉冲值清0 } } for(j=0;j lfchange[j]=fchange[j];//将线路的首次变化存入前次首次变化 fchange[j]=0;//首次变化清0 linestate100[j] =linestate2[j]; //保存当前各扫描结果到100ms前的结果 } return; } //此函数不需要修改 extern \{ delete b; } 3.3结论或总结 1、连接运行上述程序,拨打电话时能够正常打通,说明所编的位间隔程序正确。 35