东北林业大学课程设计
所示,MSC事件响应后,上位机程序接收到的数据被会被存储在数组rxdata中,为了提高识别效率,程序以32为步长抽样判断接收到的数据是否为有效引导字符,若接收到的数据中包含有非0xAA、0xBB或0xCC的字节,则表明系统出现了异常,程序会弹出“引导字符识别错误”对话框。引导字符识别成功后,状态标志state的值会被设置成引导字符的值,在随后的MSC事件中,程序会根据state的值来选择数据记录的方式。state为0xAA表示DTMF数据,state为0xBB表示语音数据,state为0xCC表示FSK数据,state为0表示空闲,只有state为0程序才会对引导字符进行识别。
if(state==0) { }
for(k=10;k<1024;k+=32) { }
state=rxdata[512];
if(rxdata[k]!=0xaa && rxdata[k]!=0xbb && rxdata[k]!=0xcc) { }
state=0;
AfxMessageBox(\引导字符识别错误!\return;
5.3.2 来电信息记录
当上位机程序识别到0xCC前导字符后会进入到FSK状态,该状态下的程序流程如图5—6所示。前导字符0xCC由下位机在检测到第一声振铃后发送,因此上位机只要进入FSK状态即表明有呼叫进入。在第一声振铃后,下位机会将承载着来电日期、时间和号码的FSK数据上传给上位机,为了逐个接收这些数据,上位机程序会在第一声振铃后将MSC控件的RThreshold属性设为1,至此,上位机程序已准备好接收FSK数据。
24
东北林业大学课程设计
FSK 状态 FSK超时 定时器超时 振铃超时 定时器超时 第一声振铃 Y 弹出用户界面通过消息向主界面窗口发送等待接听动画 N 接收FSK数据设置 FSK超时定时器 设置振铃超时定时器 提取来电号码 提取来电号码 查询来电者姓名 查询来电者姓名 识别语音向导 通过消息将号码和姓名发送给主界面窗口 将来电信息导入数据库,并将类型标示为未接 N 发现语音前导 Y 状态标示为语音 结束 结束 结束
图 5—6 来电信息记录流程图
在接收到FSK数据后,程序会设置一个FSK超时定时器和振铃超时定时器,FSK的超时表明下位机的FSK数据已经发送完毕,超时函数会从接收到的数据中提取出来电号码并从数据库中查询姓名,然后发送给主界面窗口显示。振铃的超时表明主叫方在呼叫无人接听的情况下终止了呼叫,超时函数根据来电号码查询出来电姓名,然后将来电信息记录到数据库中,同时会将号码和姓名发送给主界面窗口,并将主界面窗口状态标志为“未接来电”。
下位机在用户接听电话后会发送语音前导,以指示上位机开始录音,因此上位机在接收FSK的数据的过程中同时要检测语音前导,语音前导是1024个0xBB,然而此时MSC控件的RThreshold属性为1,因此在事件响应时不可能将1024个0xBB全部接收到,我们的实现方法是只要检测到5个连续的0xBB即会将状态标志为语音,在下次MSC事件中便会启动录音。
5.3.3 去电信息记录
去电信息的记录是在DTMF状态下完成的,该状态下的程序流程如图5—7所示。DTMF状态初次进入时,上位机程序的界面会自动弹出,同时MSC控件的RThreshold属性会被设置为1,以便逐个接收用户拨出的号码,此后用户的每次拨号都会产生一个MSC事件,事件被响应后,程序会设置拨号超时定时器并将号码逐个发送给主界面窗口,拨号超时后程序则认为拨号结束,拨号超时函数被执行。在拨号超时函数中程序会根据拨出的号码从数据库中查询出姓名并将其发送给主界面窗口显示,然后程序复位到初始状态。
程序复位到初始状态后,会不断的检测引导字符,若检测到0xBB语音前导,则开始
25
东北林业大学课程设计
录音。理想的处理情况是下位机在检测到对方接听电话后便向上位机发送语音前导,指示上位机开始录音,然而受电话业务的局限,对方的摘机信号并不会发送给主叫用户端,因此下位机只能通过拨号超时机制来向上位机发送语音前导的,这样做的坏处是可能会录到一些回铃音或彩铃音。
如果用户在拨号超时前就挂机停止拨号,下位机会向上位机发送一个0xDD结束标志,上位机在检测到该字节后也会复位到初始状态。
DTMF 状态 首次进入 Y 弹出用户界面 发送正在拨号动画 Rthreshold属性设为1 N 拨号超时 设置拨号超时定时器接收号码 查询姓名 将姓名发送给 主界面 有结束标志 N 将号码发送给 主界面窗口 Y 系统复位到 初始状态 系统复位到 初始状态 结束 结束
图 5—7 去电信息记录流程图
5.3.4 语音信息记录
语音信息的记录流程如图5—8所示,首次进入语音状态时,程序会以系统的当前日期和时间为名称创建一个文件,文件名的的格式为“XXXX_XX_XX XX_XX_XX.wav”。此时MSC控件的RThreshold属性为1024,也就是说程序每接收1024个字节的数据才会产生一次MSC事件,每次事件响应后,程序都会将接收到的数据添加文件的末尾。当用户挂机后,下位机即会停止向上位机发送数据,上位机等待超时后会执行语音超时函数,在该函数中程序会根据接收到的数据长度和当前系统时间计算WAV文件头和通话时长,并将相应信息写入到数据库中。
26
东北林业大学课程设计
语音 状态 语音定时器 超时 首次进入 Y 向主界面窗口发送 正在录音动画 N 计算WAV文件头 并将其写入文件 接收语音数据 并将其存入文件 获取系统时间 并计算时长 来电信息写入 根据系统时间计算 文件名并创建文件 设置语言 超时定时器 系统复位到 初始状态 结束 数据库 结束
图 5—8 语音信息记录流程图
5.3.5 数据库操作
为了方便对通话记录和电话簿进行管理,程序用ODBC(Open Database Connectivity,开放数据库互连)连接了Execl数据库。ODBC是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API函数,这些API利用SQL来完成其大部分的任务,同时ODBC也保留了对SQL语言的的支持,用户可以直接将SQL语句传递给ODBC。
程序中关于数据库的基本操作如记录的添加、删除和查找等在后台都是由SQL语句通过ODBC实现的,关于数据库编程不是本系统的重点,在此不再赘述。
5.4 其他
为了提供友好的用户界面,上位机程序添加了GIF动画显示的功能,该功能由免费的CPictureEx类实现,程序还用SkinMagicToolkit美化了界面的皮肤。
27
东北林业大学课程设计
6 系统调试
6.1 测试方案设计
系统的调试分为硬件调试和软件调试。硬件调试是系统调试的关键,即使硬件出现一个小小的问题,都会对以后的软件调试产生很大的影响。常见的硬件故障主要有:
(1) 焊接工艺不善,虚焊造成焊点接触不良,由于系统大量采用贴片元件,而且还有一片很大的FPGA,增加了焊接的难度,虚焊的问题更为常见。
(2) 元件管脚与焊盘不对应。焊接时,贴片元件管脚与焊点不对应,直插元件插接错误都会使电路不能工作,甚至导致元件永久损坏。
(3) 电路连接错误。在电路原理图绘制过程中可能会出现连线错误,而导致电路不能工作。
(4) 电路设计错误或不完善。电路设计的原理性错误或不完善会导致电路不能工作或不能达到预期功能。
(5) 元器件未经检查或筛选不严格,造成元器件失效。
(6) 电路布局不合理。常见的有对电源地的处理,如果处理不当,电源地会出现回路等问题,导致电路工作不稳定;一些高频信号的走线,若设计不符合规定对其它电路产生高频干扰;信号线之间的屏蔽问题,若走线不当,相互之间会产生串扰。
根据个人经验体会,硬件调试的一般方法有:
(1)在焊接电路时,确认元件没有损坏,对元件进行筛选,焊接时与焊盘对应,焊接完一个元件后用万用表测试一下焊点,保证焊接正确。 (2)在插芯片时,保证插接正确,防止元件损坏。
(3)如果碰到电路连接错误,常用方法就是用跳线进行更正。
(4)若电路设计错误或不完善,假如电路更改较容易实现的话就对电路进行改正,否则应该重新设计。
(5)电路布局不当出现的问题较不易发现,而解决此问题的方法也不容易。避免这些问题的最好方法是在设计之初时慎重考虑电路板布局。
软件调试是系统调试中最艰巨的任务了,调试开始时,软件开发者仅仅面对着错误的征兆,然而在问题的外部现象和内在原因之间往往并没有明显的联系,在组成程序的密密麻麻的元素中,每一个都可能是错误的根源。然而使用正确的高级的调试工具会使调试过程变的简单,从而加快开发速度。在调试FPGA程序时使用逻辑分析仪,可以很快定位错误出现在哪一个信号,首先通过软件的探针设置可以将任何一个内部信号引到外部IO,这样将逻辑分析仪的引线与FPGA的IO一一对应连接,在程序开始运行之后,通过一个信号触发逻辑分析仪开始工作,她可以将所有信号捕捉并存储,通过上位机软件我们可以清楚的观察到在任意时刻信号的变化情况,是否正常,从而迅速定位错误并进行修正,然后进行验证。
6.2 系统典型故障与分析
虽然系统的硬件电路不是很复杂,但是由于涉及到前端模拟电路,FPGA以及上位机软件三大部分,任何一个环节出现问题都会导致工作不正常,所以在调试过程中出现了很多故障,在这里对出现的典型故障进行解释说明,希望对以后的学习与教学实验有一定帮助。
28