本文是关于交换原理实验二——摘挂机检测实验报告记录。

一、实验目的

摘挂机检测实验用来考查学生对摘挂机检测原理的掌握情况。

二、实验内容和实验步骤

1、实验原理及设计

设用户在挂机状态时扫描输出为“0”,用户在摘机状态时扫描输出为“1”,摘挂机扫描程序的执行周期为200ms,那么摘机识别,就是在200ms的周期性扫描中找到从“0”到“1”的变化点,挂机识别就是在200ms的周期性扫描中找到从“1”到“0”的变化点。

在我们的实验中,我们把前200ms的线路状态保存以备这次可以读取,同时读出这次的线路状态,把前200ms的线路状态取反与这次的线路状态相与,如果为1,就说明检测到摘机消息了。同理,我们把这次的线路状态取反再与前200ms的线路状态相与,如果为1就说明检测到挂机消息了,然后把摘挂机信号作为事件放入摘挂机队列中。

2、实验主要数据结构

函数功能为:检测到摘、挂机事件,并把该事件放入到摘挂机事件队列中。

函数原型:

1
void scanfor200(int linestate200[LINEMAX],int  linestate[LINEMAX],UpOnnode * head1, UpOnnode*  end1);

其中LINEMAX为线路总数,是定义在”bconstant.h”中的一个宏,linestate200[LINEMAX]为已保存的200ms前线路状态,linestate[LINEMAX]为当前的线路状态,head1,end1为摘挂机队列的首尾指针,该队列已经在主程序中进行了初始化。我们所要做的就是把检测到的摘挂机事件以摘挂机队列节点的形式插入到摘挂机事件队列中。

数据结构说明:

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"bconstant.h"	//以下的数据结构都已在该文件中定义

LINEMAX //最大线路数;

int linestate200[LINEMAX],linestate[LINEMAX] //线路从0开始编号;状态:1:有电流,0无电流;

enum UporOn {ehandup,ehandon} //为摘挂机区别符:ehandup表示摘机,ehandon表示挂机;

struct UpOnnode //摘挂机队列节点结构
{
UporOn phonestate; //摘挂机区别符;
int linenum; //线路号(从0开始);
struct UpOnnode* next; //指向下一节点的指针;
};

注意事项:

  1. 我们编写的模块是基础实验部分预加载的本局交换系统的一个模块而已,在系统中head1头指针和end1尾指针已经完成初始化。为方便起见,我们的摘挂机事件队列是一个包含头节点的单向链表,并且头指针指向该头节点,尾指针在初始化时也指向了该节点。所以在我们的函数编写中应保证头指针始终指向该头节点上、尾指针指向摘挂机事件队列的最末一个节点。

  2. 注意把这次扫描的线路状态值保存在前200ms扫描线路状态数组中,以便主程周期调用。

3、实验效果检验

当调度表初始化正确时,能够进行正常的通话;如果初始化不正确,可能会造成周期性程序的不正常调用,例如位间隔调度的延迟会造成识别位间隔的延误甚至丢失。

4、实验步骤

  1. 熟悉实验平台和测试环境;
  2. 编写C程序实现所要求的功能;
  3. 运行测试程序;
  4. 完成实验报告。

三、源代码

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "bconstant.h"
extern "C" _declspec(dllexport) void scanfor200(int linestate200[LINEMAX], int linestate[LINEMAX], UpOnnode *head1, UpOnnode *end1)
{
int i;
for (i = 0; i <= LINEMAX; i++)
{
struct UpOnnode *newNode = new struct UpOnnode;
if (!linestate200[i] && linestate[i])
{
newNode->phonestate = ehandup;
}
if (!linestate[i] && linestate200[i])
{
newNode->phonestate = ehandon;
}
newNode->linenum = i;
newNode->next = 0;
end1->next = newNode;
end1 = newNode;
linestate200[i] = linestate[i];
}

return;
}

// 此函数不需修改
extern "C" _declspec(dllexport) void freenode(UpOnnode *node)
{
delete node;
}

四、实验结果

运行程序后,能正确检测摘挂机动作并且能进行通话,与预期结果相符,成功。

五、实验心得

这次实验也比较简单,主要用来考察对摘挂机检测的原理的掌握情况。在实验中遇到的比较困难的就是新节点添加到链表中指针如何分配,因为大一学过的知识时间比较久了,记得不是很清晰,于是就先复习了链表相关的知识,最终也成功实现了要求的功能。通过这次实验, 我加深了对摘挂机检测原理的掌握(检测到摘挂机事件,都将该事件添加到队列中),深入了解了摘挂机的详细过程,增强了对实验平台的熟悉和对软件的了解,收获很大。

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒...