短信平台设计

上传人:仙*** 文档编号:34510225 上传时间:2021-10-21 格式:DOC 页数:18 大小:809KB
收藏 版权申诉 举报 下载
短信平台设计_第1页
第1页 / 共18页
短信平台设计_第2页
第2页 / 共18页
短信平台设计_第3页
第3页 / 共18页
资源描述:

《短信平台设计》由会员分享,可在线阅读,更多相关《短信平台设计(18页珍藏版)》请在装配图网上搜索。

1、实时短信互动平台设计摘要:随着手机的普及,短信已经成为现代人的一种主要交流方式,但短信的应用不仅局限在人们之间点对点的交流,其同样能应用于课堂教学、大型活动的实时互动上。本系统使用通用串行总线将SIM300 GSM模块与PC机相连,可将短信数据传送到PC机上进行进一步的处理。PC端软件使用Windows操作系统下的Visual Studio 2008集成开发环境进行编写,开发语言为C+,使用了MFC类库和MSComm ActiveX控件。平台可实现即时互动、投票表决、课堂练习等三种功能。软件可与PowerPoint等演示软件协同运行,有良好的兼容性。关键词:短信平台 GSM模块 串口通信 C+

2、 MFC 绪论 随着通信技术的发展,手机已经成为每个现代人的必备通信工具,短信也成为很多人特别是年轻人的喜欢的通信方式。但SMS(Short Messaging Service,短消息服务,即常说的“短信”)是一种传递消息的手段,它的功能远不限于人与人之间点对点的消息传递,由于手机的普及性,我们还可以利用短信的内容,实现大型活动、课堂教学的实时交流互动。实际上,类似的短信平台早就出现过,最常见的例子就是电视节目中的短信互动平台。但这种平台一般是由运营商提供,客户在支付一定的使用费后通信运营商才会通过公众互联网将短信内容发送到客户的处理机上。这种平台仅限于大型企业、电视台等有资金的单位,如果仅为

3、了一次活动或者课堂教学就购买相应的服务很不值得。另外,向这种平台发送短信的用户也需要支付高额的信息费。本平台面向现场活动和普通高校的课堂教学进行设计,硬件上只使用一个廉价的GSM模块,它可以实现包括发短信、打电话在内的手机通信功能。通过使用通用串口将GSM模块连接到个人计算机上,就可以用计算机软件实现对模块的控制并接收GSM发回的信息。软件是本系统最核心的地方,主要可以分为三个模块:通信、显示、编码处理。通过软件作用,计算机可以和手机一样接收短信,并且可以通过短信内容,实现手机无法处理的功能,比如大屏幕即时显示、投票计数、选择题评分等。1 功能分析与硬件设计1.1 功能分析1.1.1 主要功能

4、分析根据举办活动及课堂教学的实际情况分析,系统可初步设计以下几种主要功能:(1)实时显示:将参与者发送的短信内容实时地展现在屏幕上,可用作现场回答提问、回答问题、多人讨论等;(2)投票表决:参与者发送特定的字母或数字,系统实时统计各选项的人数,可用作无记名投票表决、单个选择题联系等;(3)选择练习:类似标准化考试中所用的选择题答题卡,学生将选择题答案按规定格式发给系统,系统自动统计每个学生的成绩和每个题目的正确率等情况。1.1.2 辅助功能分析系统还需要部分附加功能来配合主要功能来充分发挥系统的全部作用,比如:(1)自适应字体:展示用的电脑屏幕分辨率不是固定的,因此最好设计一种算法使得字体能够

5、自动适应屏幕,将一个短信完整得显示在屏幕上并且能使屏幕分辨率得到充分的利用;(2)关键词过滤:将特殊关键词用其他词语或星号等替代,避免现场秩序混乱或者不文明发言;(3)短信号码过滤:在投票表决等功能中避免无关人员参加或者一人多投等功能的 出现,加入本功能实现无关号码的过滤;(4)文件记录:将所有发送的短信记录到文件中,以便日后的查看;(5)用户界面定制:用户界面是软件的重要组成部分,用户最好可根据自己的喜好定制自己喜欢的用户界面,比如显示界面背景更换,文字字体、颜色的更换等。1.2 硬件设计1.2.1 硬件部分总体设计本系统硬件部分较为简单,包括一个GSM模块和一台PC机,如果是笔记本电脑等不

6、带RS232接口的计算机,还需要一根USB转RS232转接线。系统总体框图如图1-1。PC机GSM模块SIM300通用串口与通信基站无线通信图1-1 系统总体硬件示意图1.2.2 GSM模块GSM是Global System for Mobile Communications的缩写,意为全球移动通信系统,是世界上主要的蜂窝系统之一。GSM80年代兴起于欧洲,1991年投入使用。到1997年底,已经在100多个国家运营,成为欧洲和亚洲实际上的标准,到了2001年,在全世界的162个国家已经建设了400个GSM通信网络。但GSM系统的容量是有限的,在网络用户过载时,就不得不构建更多的网络设施。值得

7、欣慰的是GSM在其他方面性能优异,它除了提供标准化的列表和信令系统外,还开放了一些比较智能的业务如国际漫游等。GSM手机的方便之处在于它提供了一个智能卡,人们称之为SIM卡,并且机卡可以分离,这样用户更换手机并且定制个人信息这方面都十分便利了。GSM模块,是一个类似于手机的通讯模块,集成了手机的若干功能于一块小电路板上,它可以发送短消息,通话等等,模块虽小,但它具备了很多手机的功能,拥有它等于就是拥有了手机的核心部分了,它在很多应用领域中都有着广泛的应用,GSM模块通过使用AT指令才能控制它,模块可以与电脑RS232串口相连,也可以用单片机来进行控制。由于当前市场上GSM模块产品型号众多,很多

8、国外产品可用的资料却比较少,特别是中文开发文档比较少,所以,我在选择具体模块的时候考虑了模块的技术成熟度、文档资料是否易找、购买起来是否方便和性价比。最终选择了SIMCOM公司生产的SIM300 GSM模块。模块照片如图1-2。图1-2 SIM300 GSM模块SIM300 是一款三频段 GSM/GPRS模块,可在全球范围内的EGSM 900MHz、DCS 1800MHz、PCS 1900MHz三种频率下工作,能够提供 GPRS多信道类型多达 10 个,并且支持 CS-1、CS-2、CS-3 和 CS-4 四种 GPRS编码方案。SIM300 结构小巧,外形尺寸仅 40mm*33mm*2.85

9、mm,几乎可满足所有对产品尺寸有要求的工业应用,比如智能电话,掌上电脑和其他移动设备。模块与移动应用设备通过一个 60 引脚的板板连接器相连,它提供了除了 RF 天线接口的其他所有模块与开发板的硬件接口。SIM300 具有低功耗设计,睡眠模式下的电流消耗仅为 2.5mA。SIM300 内部集成了TCP/IP 协议栈,并且扩展了 TCP/IP AT指令,使用户利用该模块开发数据传输设备变得特别简单、方便。 1.2.3 USB-RS232转接线因现在绝大多数个人计算机都不带硬件串行口,而SIM300 GSM模块必须用USART与电脑进行通信,因此需要模拟出一个串行口供GSM模块使用。而现在常用的方

10、法就是使用USB-RS232转接线。USB-RS232转接线可以将串口数据通过USB总线发送给计算机。其结构非常简单,一般只有两个芯片。其中一个是USB转TTL电平芯片,另外一个是TTL电平转RS232电平芯片。后者现在的产品都清一色的选用MAX232(5V)或者MAX3232(3.3V),而前者有很多种选择,比如低端的PL2303、HC340,中端的CP2102,高端的FT232等。因GSM所需的波特率不高,所以我选择了低端的HC340芯片。转接线的制作非常简单,按照参考电路将各个芯片连接好即可。2 软件开发环境及所需技术简介2.1 集成开发环境2.1.1 集成开发环境的选择Microsof

11、t公司的Windows操作系统是目前国内最常用的操作系统,而Windows平台下的集成开发环境主要有C+ Builder、Delphi、Eclipse、Visual Studio等。而Microsoft公司的Visual Studio无疑是最常用、兼容性最好、技术支持资料最多的集成开发环境。现在常用的Visual Studio版本主要为6.0、2008、2010。其中6.0版是最经典的版本,国内绝大部分高校、部分企业都把它当做开发或者教学的首选,其优点是效率高、技术支持资料多、界面简洁。但由于其版本太过陈旧,因此不能使用较新的技术,对最新版本的Windows系统兼容性不好。2010版是Visu

12、al Studio的最新版本,支持最新的技术,有这绚丽的界面,但由此带来的是巨大的资源消耗和极低的效率。综上考虑,我选择了介于两者之间的Visual Studio 2008版本。2.1.2 Visual Studio 2008简介Visual Studio 是一套完整的开发工具,用于生成 ASP.NET Web 应用程序、XML Web services、桌面应用程序和移动应用程序。Visual Basic、Visual C# 和 Visual C+ 都使用相同的集成开发环境 (IDE),这样就能够进行工具共享,并能够轻松地创建混合语言解决方案。另外,这些语言使用 .NET Framework

13、 的功能,它提供了可简化 ASP Web 应用程序和 XML Web services 开发的关键技术。Visual Studio 2008 在三个方面为开发人员提供了关键改进:快速的应用程序开发、高效的团队协作、突破性的用户体验。Visual Studio 2008 提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。 Visual Studio 2008 包括各种增强功能,例如可视化设计器(使用 .NET Framework 3.5 加速开发)、对 Web 开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。Visual St

14、udio 2008 为开发人员提供了所有相关的工具和框架支持,帮助创建引人注目的、令人印象深刻并支持 AJAX 的 Web 应用程序。 开发人员能够利用这些丰富的客户端和服务器端框架轻松构建以客户为中心的 Web 应用程序,这些应用程序可以集成任何后端数据提供程序、在任何当前浏览器内运行并完全访问 ASP NET 应用程序服务和 Microsoft 平台。2.2 程序设计语言2.2.1 Visual Studio 2008 所支持的程序设计语言Visual Studio 2008包含 Visual C+、Visual Basic、Visual C#等组件,分别支持 C+、Basic、C#等程序

15、设计语言。Visual Basic是一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发Windows环境下的各类应用程序。它简单易学、效率高,且功能强大可以与专业开发工具SDK相媲美。在Visual Basic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的广泛应用程序接口(SPI)函数,以用动态链接库(DLL)、对象的链接与世隔嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发Windows环境下功能强大、图形界面丰富的应用软件系统。但由于Basic语言是一种解释运行的语言,它的效率要比编译运行的语言低得多。Vi

16、sual C+是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。C#(C Sharp)是Microsoft为.NET Framework量身订做的程序语言,C#拥有C/C+的强大功能以及Visual Basic简易使用的特性,是第一个组件导向(Component-oriented)的程序语言,和C+与Java一样亦为对象导向(object-oriented)程序语

17、言。2.2.2 程序设计语言的选择从上文的介绍来看,具有C语言语法和高效性又具有Basic语言简便性的C#语言貌似是本项目的最佳选择。但本平台的应用特点决定了该程序将在多个具有不同版本操作系统的计算机上运行,而且大多数此类计算机都带有还原卡。而C#程序的运行又必须依赖于.NET Framework,每次使用前都配置一次程序无疑是项非常耗费时间的工作。而Visual C+程序可以将所需的动态链接库静态封装在程序中,虽然程序体积会变大,但使用非常方便。因此,我选择Visual C+作为开发本平台的程序设计语言。2.3 微软基础类库(MFC)简介MFC(Microsoft Foundation Cl

18、asses),是一个微软公司提供的类库(class libraries),以C+类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC(Microsoft Foundation Class Library)中的各种类结合起来构成一个应用程序框架,它的目的就是让程序员在此基础上来建立windows下的应用程序,这是一种相对SDK来说更为简洁的方法。因为整体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具

19、体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等):资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。微软基础类库由两部分组成:一是通常所说的C+类库,是MFC类库的主体部分,这些类构成了MFC应用程序框架。二是MFC预定义宏、全局变量和全局函数,是MFC类库的辅助部分,它们都是MFC进行Windows应用程序开发不可缺少的组成部分。MFC类库按照功能应用划分为基本基类(根类、CObject类、C

20、RuntimeClass类、命令目标类、窗口类)、应用程序结构类(应用程序类、文档模板类、边框窗口类、文档类、视图类、菜单和控件栏类等)、对话框和控件类(一般对话框类、通用对话框类、属性选项卡类、网页对话框类、普通控件类和附加控件类、通用控件类、CListCtrl类)、图形显示和打印类(绘图类、GDI绘图工具栏类、其它绘图工具类、MFC打印机制和打印信息类)、数据类型和集合类(简单数据类型类、数组类、链表类、映射类、模板集合类)、线程和同步类(线程类、同步类、同步访问类)、文件和数据库类(文件类、ODBC数据库类、OLE-DB数据库类)、网络和Internet类(Windows Sockets

21、类、ISAPI类、WinInet类)、OLE类(容器程序类、文字处理器程序类、服务器程序类、OLE拖放和数据传输类、OLE自动化类、与OLE有关的类)、ActiveX控件类(ActiveX控件的核心类、与ActiveX控件有关的其它类)、调试和异常类(调试支持类、异常类)。2.4 微软通信控制(MS Communication Control, MSComm)控件简介Microsoft Communication Control是Microsoft公司提供的一种专门用于控制PC机串口通信的ActiveX控件,利用它可以极大地简化串口编程。MSComm也提供了各种中断响应代码与错误处理代码。本程

22、序中使用的是Microsoft Communication Control 6.0版本的控件。MSComm控件提供了功能完善的串口数据的发送和接收功能,MSComm控件具有两种处理方式:1、事件驱动方式:由MSComm控件的OnComm事件捕获并处理通信错误及事件;2、查询方式:通过检查CommEvent属性的值来判断事件和错误。MSComm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv解释并传给设备驱动程序执行的,对于程序开发者只需知道MSComm控件的属性和事件的用法即可以实现串口的操作。如果在通信过程中发生错误或事件,就会引发OnComm事件并且改变属性值

23、,由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。3 软件设计3.1 用户界面设计一个好的UI(User Interface,用户界面)不仅能能使软件有一个好的“面子”还能方便用户操作、带给用户良好的体验。而且本软件的一项重要功能就是展示功能,因此必须重视用户界面的设计。3.1.1 主窗口设计本平台在使用时一般与PowerPoint等演示软件一起配合,在无新任务时尽量避免主窗口的占用屏幕空间,影响演示软件的运行。把主窗口设计成对话框形式是一个比较好的选择。新建一个Visual Studio 2008工程,工程名取为CIS2,在“工程类型”中选择“MF

24、C应用程序”,在“MFC应用程序向导”的“应用程序类型”选项卡中选择“基于对话框”单选项,即可创建一个基于对话框的MFC应用程序。因需要在多台电脑上使用本程序,“MFC的使用”尽量选择“在静态库中使用MFC”,这样系统会把MFC的所需模块编译到EXE应用程序中,不需要DLL文件的支持。在“用户界面功能”选项卡中,仅选中“最小化框”,其他都不选择。在“生成的类”选项卡中,可以看到系统会给应用程序自动生成两个类。其中,CCIS2App是应用程序类,CCIS2Dlg是主窗口的类,它是CDialog的一个派生类。完成新工程的配置后,VS2008会自动生成主对话框,之后就可以向上摆放需要的控件了。在本程

25、序中,根据平台功能的需要,摆放五个组合框,其Caption属性分别改名为“通信”、“状态”、“功能”、“属性”、“控制”。之后向组合框中添加需要的控件,添加完成后根据需要改变控件的大小和位置。控件摆放完成后,将对话框大小调整到合适的程度,最终完成的效果如图3-1。图3-1 主对话框样式3.1.2 主窗口UI程序为使窗口上的某些控件在启动时默认选中或默认禁用,需要在CCIS2Dlg:OnCreate()中添加部分代码。使“关闭”按钮默认禁用:GetDlgItem(IDC_BUTTONCLOSE)-EnableWindow(FALSE);使“即时交互”和“显示发件人及时间”默认选中:CButton

26、* radio=(CButton*)GetDlgItem(IDC_RADIO1);radio-SetCheck(1);CButton *PNCheck=(CButton*)GetDlgItem(IDC_CHECK1);PNCheck-SetCheck(1);使“显示延时”文本编辑框中显示默认数字:GetDlgItem(IDC_EDIT2)-SetWindowText(L10); 为使“状态显示”中的文字更加突出,需要将Static中的文字颜色改变,为达到这种效果,可在CCIS2Dlg:OnCtlColor()事件响应中添加下列代码:if(pWnd-GetDlgCtrlID()=IDC_STAS

27、TA)pDC-SetTextColor(RGB(255,0,0);pDC-SetBkMode(TRANSPARENT);pDC-SelectObject(&m_StaFont);改变“状态显示”中的文字也非常简单, 如:GetDlgItem(IDC_STASTA)-SetWindowText(L系统已关闭);3.1.3 显示窗口设计显示窗口用来显示系统接收到的短信等内容,其前期设计非常简单,只需要新建一个对话框,“属性”中去掉边框,并摆放4个Button类控件即可,如图3-2.图3-2 显示窗口的初步设计3.1.4 显示窗口UI程序相比主窗口来说,显示窗口的程序设计要复杂得多。首先,显示窗口在

28、需要在弹出后置于其他所有窗口的顶端,并且为了尽量少地遮盖后方窗口,显示窗口需要根据要显示的内容自动调整大小并居中。得到显示文字的大小可以用MFC中的CDC:GetTextMetrics()函数取得。具体代码如下:dc.SelectObject(&m_ShowFont);dc.GetTextMetrics(&tm);tsize=dc.GetTextExtent(m_ShowText);得到文本的大小参数后,可以用CWnd:SetWindowPos()函数来设置窗口的大小,函数的第一个参数是设置窗口的显示方式,如果将该参数改为&wndTopMost,则可以将显示窗口置于其他窗口的顶端。具体代码如下

29、:SetWindowPos(&wndTopMost,0,0,tm.tmAveCharWidth*24,(m_ShowText.GetLength()/12+1)*tsize.cy+30+25,SWP_NOMOVE);其他的参数是根据多次试验凑试出来的最佳值。调整好窗口的大小后,四个按钮控件的位置也需要改变到窗口的右下角,实现该功能同样可以用CWnd:SetWindowPos()函数实现。在调整控件位置之前,需要获取窗口的位置和大小,从而得到窗口最右下角的大小,这个功能可以用CWnd: GetWindowRect()函数实现。以上具体代码如下:CRect DlgRect;GetWindowRec

30、t(&DlgRect);m_ButtonClose.MoveWindow(DlgRect.right-DlgRect.left-30,DlgRect.bottom-DlgRect.top-25,30,25);m_ButtonNext.MoveWindow(DlgRect.right-DlgRect.left-60,DlgRect.bottom-DlgRect.top-25,30,25);m_ButtonPause.MoveWindow(DlgRect.right-DlgRect.left-90,DlgRect.bottom-DlgRect.top-25,30,25);m_ButtonPrevi

31、ous.MoveWindow(DlgRect.right-DlgRect.left-120,DlgRect.bottom-DlgRect.top-25,30,25);第一次开启窗口时,最好将窗口置于屏幕最中央,得到屏幕分辨率等信息可用:GetSystemMetics()函数实现,代码如下:CRect DlgRect;ResizeDlg();GetWindowRect(&DlgRect);SetWindowPos(&wndTopMost,(:GetSystemMetrics(SM_CXSCREEN)-(DlgRect.right-DlgRect.left)/2,(:GetSystemMetric

32、s(SM_CYSCREEN)-(DlgRect.bottom-DlgRect.top)/2,0,0,SWP_NOSIZE);为使窗口更加漂亮,需改变现实窗口的背景图片和文字的字体、颜色。加入背景图片需要先在工程资源中加入要显示背景的Bitmap文件。然后将资源加载到画刷中,可用如下代码完成:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(&bitmap);CPen pen(PS_SOLID,8,RGB(37,239,0);dc.SelectObject(&brush);dc.SelectObject(&pen);dc.Rec

33、tangle(ShowRect);字体的选择代码:CFont *pOldFont=dc.SelectObject(&m_ShowFont);dc.SetTextColor(RGB(255,0,0);dc.SetBkMode(TRANSPARENT);在一个固定区域中显示多行文字最好的方法是用CDC:DrawText()函数,函数的参数3为设置文本显示方式,DT_CENTER为在区域中居中显示,DT_WORDBREAK为自动换行:dc.DrawText(m_ShowText,ShowRect,DT_CENTER | DT_WORDBREAK); 显示窗口还有一个问题,就是它没有标题栏,无法移动窗

34、口的位置。解决这个问题的方法是将窗口的客户区域非控件的位置模拟成标题栏,为达到目标,可以重载CDialog:OnNcTest()响应,在事件响应中加入如下代码:LRESULT nHitTest = CDialog:OnNcHitTest(point);if (nHitTest = HTCLIENT & GetAsyncKeyState(MK_LBUTTON) 0 ) nHitTest = HTCAPTION;return nHitTest;加入以上代码后,显示窗口的最终显示效果如图3-3:图3-3 显示窗口加入代码后的效果3.1.5 其他窗口UI除了以上两个主要窗口外,还有“关于”窗口和“字体

35、设置”窗口,这两个窗口没有特别复杂的代码,只需要完成大体设计即可。“关于”窗口和“字体设置”窗口的效果如图3-4和图3-5:图3-4 “关于”窗口图3-5 “字体设置”窗口3.2 串口程序设计3.2.1 MSComm控件的使用MSComm控件使用前先在“菜单-项目-添加类”中加入Microsoft Communication Control 6.0控件,之后在工具箱中点击右键,在弹出菜单中点“选择项”,把相应控件加入到工具箱并拖动到窗口里。最后右键点击控件为该控件在CCIS2Dlg类中创建一个控制变量m_Comm.3.2.2 串口初始化可根据需要设置不同的串口参数并初始化串口。在本例中,由实验

36、得到GSM模块的最佳波特率为38400bps,串口帧格式为8位,无奇偶校验,1位停止位。因不同的计算机使用串口的端口不一样,这可由用户在主界面的一个下拉菜单中选择,选择代码如下:UINT PortNum=m_SerialPortSelect.GetCurSel()+1;得到串口号后,就可以用MSComm类中的成员函数对所使用的串口进行初始化:m_Comm.put_CommPort(PortNum); /设置串口号m_Comm.put_InputMode(1); /文本输入 输出m_Comm.put_InBufferSize(1024); /设置输入缓冲区大小m_Comm.put_OutBuff

37、erSize(1024); /设置输出缓冲区大小m_Comm.put_Settings(L38400,n,8,1); /设置波特率,数据格式if(!m_Comm.get_PortOpen() /打开串口m_Comm.put_PortOpen(TRUE);m_Comm.put_RThreshold(1); m_Comm.put_InputLen(0);m_Comm.get_Input();3.2.3 串口数据的收发MSComm串口数据收发较为简单,但是由于串口通常使用ASCII码或16进制代码作为发送接收的统一编码,而本程序为了处理方便使用的是Unicode编码,提取和转换这些编码是一件非常麻烦

38、的事情。关于Unicode及其他编码的转换和处理会在之后的章节中单独说明,在此只描述串口数据的基本收发程序。串口数据的发送使用MSComm:put_Output()函数来实现,每次只能收发一个字节的数据,因此需要对数据进行处理。以下是CCIS2Dlg:SendData()函数:void CCIS2Dlg:SendData(void)/发送m_TxBuf中的数据char *CharString=NULL;DWORD Count=WideCharToMultiByte(CP_OEMCP,NULL,m_TxBuf,-1,NULL,0,NULL,FALSE);CharString=new charCo

39、unt;WideCharToMultiByte(CP_OEMCP,NULL,m_TxBuf,-1,CharString,Count,NULL,FALSE);CByteArray BArray;BArray.RemoveAll();BArray.SetSize(Count);for(DWORD i=0;i0)VARIANT m_input=m_Comm.get_Input();char *str=(char*)(unsigned char*)m_input.parray-pvData;m_RxBuf=(char*)str;m_RxBuf=m_RxBuf.Left(k);经过上述代码的处理,接收到

40、的全部短信内容已经就全部存放在CString类型的m_RxBuf数据成员里了。3.3 编码转换程序3.3.1 Unicode码与ASCII码Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。Unicode定义了大到足以代表人类所有可读字符的字符集。美国标准信息交换代码是由美国国家标准学会(American National Standard Institute

41、, ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。在Visual C+ 6.0及以前的版本中,绝大多数嵌入式编译器中,用的是ASCII编码,ASCII编码存储的基本单位是8位的char型。Unicode编码的基本存储单位是16位的wchar_t型,Visual Studio

42、2008默认使用的就是Unicode编码(自动定义宏_UNICODE)。MFC中有很多Unicode编码操作函数,因此使用Unicode能极大简化程序。在Visual Studio 2008 IDE中,用英文半角双引号包裹的是ASCII码字符串,而用L+英文半角双引号包裹的是Unicode编码。3.3.2 Unicode字符串和ASCII字符串的转换MFC中提供了Unicode字符串和ASCII字符串的函数,分别是WideCharToMultiByte()和MultiByteToWideChar().但这两个函数都需要一个代表字符串长度的形参,和一个CString型变量。因此,为高效地使用这两

43、个函数,我们可以用new和delete运算符在程序内存的堆区动态分配一个CString类型,然后利用两个函数的返回值确定字符串长度,具体程序如下:/将UNICODE字符串转换为ASCII字符串DWORD Count=WideCharToMultiByte(CP_OEMCP,NULL,m_TxBuf,-1,NULL,0,NULL,FALSE);CharString=new charCount;WideCharToMultiByte(CP_OEMCP,NULL,m_TxBuf,-1,CharString,Count,NULL,FALSE);/将ASCII字符串转换为UNICODE字符串char *

44、str=(char*)(unsigned char*)m_input.parray-pvData;m_RxBuf=(char*)str;m_RxBuf=m_RxBuf.Left(k);3.3.3 将UNICODE字符串转化为汉字在本程序中,接收到短信的字符串是用UNICODE文本就行编码的,只有将响应的编码转换为汉字才能得到正确的中文短信内容。转换代码如下:/将Unicode编码的16进制字符串转换为汉字bool UniHexToHZ(CString &HexStr,CString &HZStr)UINT HexLen,HZLen;HexLen=HexStr.GetLength();if(He

45、xLen%4) return false;HZLen=HexLen/4+1;WCHAR *pCode=new WCHARHZLen;for (UINT i=0;iEnableWindow(FALSE); /串口GetDlgItem(IDC_BTCLOSE)-EnableWindow(TRUE); /关闭GetDlgItem(IDC_STASTA)-SetWindowText(L握手未成功,重试);m_TxBuf=LATE0rn;SendData();/串口接收事件if(m_Statue=2)if(m_RxBuf.Right(4)=LOKrn)m_Comm.put_PortOpen(FALSE)

46、;m_Statue=5;GetDlgItem(IDC_STASTA)-SetWindowText(L握手成功,请启动);/控件控制GetDlgItem(IDC_SelectPort)-EnableWindow(FALSE); /串口GetDlgItem(IDC_BTCLOSE)-EnableWindow(TRUE); /关闭return;3.4.3 短信的接收短信的接收程序大致可分为以下几步:(1)GSM模块发送+CMNI指令,表明有新的信息接收到,+CMNI指令后的参数中有新接收到短信的代码m_Index;(2)程序发送AT+CMGR = m_Index指令要求读取新收到的短信;(3)GSM

47、模块用+CMGR为起始的一个字符串将短信内容发送给程序;(4)程序发送AT+CMGD = m_Index指令将该条短信从SIM卡上删除。判断是否是新短信提示信息,并要求接收短信的程序实现如下:/串口接收实践中,判断是否是接收到短信的提示信息if (m_RxBuf.Left(5)=L+CMTI | m_RxBuf.Left(7)=Lrn+CMTI)m_LastSMSIndex=GetSmsIndex(m_RxBuf);m_TxBuf=LAT+CMGR=+m_LastSMSIndex+Lrn;SendData();return;3.5短信处理程序3.5.1 PDU编码协议数据单元PDU(Proto

48、col Data Unit)是指对等层次之间传递的数据单位。 协议数据单元(Protocol Data Unit )物理层的 PDU是数据位(bit),数据链路层的 PDU是数据帧(frame),网络层的PDU是数据包(packet),传输层的 PDU是数据段(segment),其他更高层次的PDU是数据(data)。目前,发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-

49、bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。A:短信息中心地址长度,2位十六进制数(1字节)。B:短信息中心号码类型,2位十六进制数。C:短信息中心号码,B+C的长度将由A中的数据决定。D:文件头字节,2位十六进制数。 E:信息类型,2位十六进制数。F:被叫号码长度,2位十六进制数。G:被叫号码类型,2位十六进制数,取值同B。H:被叫号码,长度由F中的数据决定。I:协议标识,2位十六进制数。J:数据编码方案,2位十六进

50、制数。K:有效期,2位十六进制数。L:用户数据长度,2位十六进制数。M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。3.5.2 解码程序了解了SMS所使用的PDU编码之后,就可以按照短信格式提取信息了。为使信息处理方便,定义一个SMS类型的结构体:struct SMSCString PhoneNum;CString Text;里面分别储存了一个短信的号码和正文。处理短信程序单独放在一个函数SMS GetSms(CString &Str)中,其中Str是接收到的以+CMGR开头的Unicode字符串。对短信的处理过程可分为以下几步:(1)删除返回

51、的控制信息,只需要查找第一个换行符位置并删除前面的所有字符Str.Delete(0,Str.Find(Ln)+1);(2)获取手机号码的长度、短信正文的长度以及短信正文的入口处。由于返回PDU格式编码的手机号码和短信正文这两项的长度是不一样的,只有知道他们的长度和入口位置才能提取到正确的信息,短信号码的入口位置是固定的,而短信正文的入口位置取决于短信号码的长度。获取它们长度的方法是读取代表长度的字符串并将其转换为数字。代码如下:/手机号码长度PhoneNumLen=THexWCtoUINT(Str.Mid(20,2)+2;if (PhoneNumLen%2!=0) PhoneNumLen+;/

52、得到短信正文长度TextLen=THexWCtoUINT(Str.Mid(40+PhoneNumLen,2)*2;(3)提取短信正文,并转换为汉字。短信正文的位置可以由手机号码长度计算得到,而正文的提取可以用之前提到的将Unicode编码转换为汉字的函数。代码如下:/获得短信正文,16进制数字符串CString HexString=Str.Mid(42+PhoneNumLen,TextLen);/16进制字符串流转换为文字UniHexToHZ(HexString,s.Text);(4)提取短信发件人号码。/获取发件人号码CString CTemp=Str.Mid(22,PhoneNumLen)

53、;CString CTemp2=L;for(UINT i=0;iCreate(IDD_DlgShow,this);m_PDialogShow-ShowWindow(SW_SHOW);3.6.3 短消息链表因MSComm的响应事件在主对话框中处理,短信内容也暂时存放在主对话框类中的变量里。在显示时需要将主对话框中的信息传递给显示对话框,传递的方法很简单,只需要借助对话框指针得到显示对话框的地址即可访问其数据成员。为实现多条短消息循环滚动显示,需要将接受到的短信存储在一个双向链表中,每接收到一条短信就在队尾添加一个节点。双向链表结构体的定义如下:struct SMSNodeSMSNode *Prev;SMS sms;SMSNode *Next;接收到第一条短信息时初始化链表:m_PDialogShow-m_CurrentSMS=new SMSNode;m_PDialogShow-m_NewestSMS=m_PDialogShow-m_CurrentSMS;m_PDialogShow-m_CurrentSMS-sms=ThisSms;m_PDialogShow-m_CurrentSMS-

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!