李绪凯 王文娟
摘要:针对有线串口通信传输距离受限的問题,提出了一种基于P900无线串口通信模块的无线文件传输系统。从系统的硬件连接、Visual C++2010环境下MSComm控件的应用及通信协议的制定三方面对系统的设计进行介绍,给出了具体的串口配置、发送和接收的软件程序设计。经试验表明,该系统稳定可靠、方便实用且传输距离较远,具有较好的推广作用。
关键词:无线;串口通信;MSComm控件;文件传输
中图分类号:TP312文献标志码:A文章编号:1008-1739(2018)07-62-3
Design on Files Transmitting System Based on Wireless Serial Port Module
LI Xukai1,WANG Wenjuan2
(1.The 54th Research Institute of CETC, Shijiazhuang Hebei 050081, China; 2. Shijiazhuang Campus, Army Engineering University, Shijiazhuang Hebei 050003, China)
0引言
串口通信是一种较为简单的计算机通信方式,将2台计算机的串口进行三线连接,仅使用接收数据引脚2(RXD)、发送数据引脚3(TXD)和信号地线引脚5(SG)就可完成硬件搭建[1-2],但是这种有线传输方式的传输距离受到串口线长度的限制。采用无线串口通信模块作为无线数据传输的硬件基础,从根本上克服了有线传输的不足和传输场地的限制,使用方便灵活[3]。
利用可视化程序设计工具Visual C++ 2010,通过权衡3种串口通信方法的优缺点,最终确定以MSComm控件进行串口通信的底层操作,在此基础上进行软件的设计与编程实现。在数据收发基础上,通过制定简单的通信协议,完成了文件的无线串口传输。
1基本设计
1.1硬件连接
硬件模块采用成都某公司生产的P900无线串口通信模块代替传统的RS232串口,实现串口数据的无线收发。该模块工作频率为908~928MHz,采用的跳频技术(Frequency-Hopping Spread Spectrum,FHSS)可实现可靠的远距离无线异步数据传输,支持点对点、点对多点的通信模式,具有即插即用的优点,使用方便。
为简化设计,应用2组P900无线串口通信模块与计算机连接,实现点对点的文件收发功能,具体硬件连接如图1所示。发送数据时,按照一定的通信协议格式,将文件数据通过计算机的RS232串口发送到与之相连接的无线串口通信模块的数据口,无线串口通信模块将数据进行校验后,按照自身的无线通信协议将数据进行打包,通过天线发送出去。同时,如果无线串口通信模块监听到无线数据,首先判断数据是否符合该模块的无线通信协议,若判断为系统内数据,则将数据进行解码,再通过数据口发送至计算机的RS232串口,通过计算机解析出文件。需要说明的是,通常设计该无线串口通信模块嵌入到计算机的内部,天线位于计算机外部。
1.2软件介绍
Visual Studio 2010开发代号为“Rosario”,与Visual Studio 2008相比有了巨大的变化。带来了增强的用户界面体验、更有条理的应用程序生命周期管理及更多的数据库支持等。特别是在C++开发方面带来了革命性的变化,这一变化也是伴随着C++新标准的公布而产生的。
在Visual C++ 2010下默认的工具箱里没有串口通信控件,要进行串口收发程序的设计与开发,首先要下载和注册控件,主要有以下2种控件选择。
①PComm:该软件包是由第三方厂商MOXA公司提供的串口通信程序模块。下载pcomm.h和pcomm.lib两个文件,复制到项目目录并引用,将pcomm.dll库文件拷贝到Windows/System32下,即可进行函数的调用,实现方便。但是要实现收发数据的实时监控,需进行多线程的程序开发,编程复杂。
②MSComm串口通信控件[4]:如果安装了VC6.0,就能在/Windows/System32下找到MSComm32.OCX、MSComm32.SRG和MSComm32.DEP三个文件。如果没有安装VC6.0,可以去CSDN网站下载,并按照说明完成控件的安装和注册。在VS2010环境下创建基于对话框的MFC应用程序后,需要在工具箱选项中的COM组件属性页下勾选Microsoft Communications Control项,工具箱中出现黄色电话图标,表明控件添加成功。MSComm串口收到数据后触发事件,有利于串口数据的实时接收,且编程较简单。
除下载控件外,实现串口数据传输的另外一种方法是调用API函数,但是这种方法需要声明和调用多个函数,编程繁琐且收发数据功能较弱。对比以上几种方法,本设计采用MSComm串口通信控件。
1.3通信协议
为了验证硬件系统与软件设计的可靠性,只制定了涉及串口数据的发送格式,一般格式及举例如表1所示。
在发送文件时,需要发送文件名,以便接收端可以得到默认的文件名。开始标志1表示文件名的起始,结束标志1表示其结束;开始标志2表示文件中数据的起始,结束标志2表示其结束,为了保证远距离传输时的数据可靠性,还应对数据进行编码,得到校验位。例如发送的文本文件名为“实验.txt”,文本内容为“hello”,则无校验时的串口发送数据将为“sname实验.txtenamesfile hello efile”。接收端收到数据后根据上述格式将文件名与数据进行恢复。
2程序设计及实现
软件设计主要包括串口配置、发送文件和接收文件。
2.1串口配置
MSComm串口通信控件封装了串口属性及基本数据传送的方法。串口配置主要是对串口进行初始化,包括设置串口的工作状态、数据格式、串口参数(波特率、有无奇偶校验、停止和数据位)及缓冲区大小等。主要的串口配置程序如下:
nSel = m_comNum.GetCurSel();//获取组合框控件的列表框中选中项的索引
m_ctrlComm.put_CommPort(nSel+1);//选择串口号(列表框的索引号是从0开始,则(nSel+1)对应的才是实际串口号)
m_ctrlComm.put_PortOpen(TRUE);//打开串口
m_ctrlComm.put_RThreshold(2);//收到2个字节引发OnComm事件
m_ctrlComm.put_InputMode(1);//输入模式选为二进制
m_ctrlComm.put_Settings(_T("115200,n,8,1"));//设置串口参数
m_ctrlComm.put_RThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发OnComm事件
m_ctrlComm.put_InputLen(1024);//设置当前接收区数据长度为0
m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据
2.2发送过程
发送过程包括选择文件和发送数据2个程序。点击打开文件按钮,选择需要发送的文件,对应的消息响应函数为:
CFileDialog fileDlg(true);//创建CFileDialog类的对象,设置为创建打开文件对话框
fileDlg.m_ofn.lpstrFilter=LPCTSTR(_T("TextFiles(*.txt)\0*.txt\0All File(*.*)\0*.*\0\0"));//设置过滤器
fileDlg.m_ofn.lpstrTitle=LPCTSTR(_T("打开文件"));//定义对话框的标题
if(fileDlg.DoModal()==IDOK)//若点击对话框的确认按钮
{
m_sendfilePath=fileDlg.GetPathName();//保存所选文件的路径
}
点击发送文件按钮,在串口打开的情况下,按照只读方式打开文件后,从文件中读取数据。将文件名及所读取的数据按照通信协议的格式进行打包,通过串口发送出去。在发送过程中,设置进度条用以显示发送进度。应用的主要函数如下:
CFile file;//建立文件类对象file
file.Open(m_sendfilePath,CFile::modeRead);//以只读方式打开文件
file.Read(pBuf,fileLen);按照文件内容大小fileLen将数据读取到缓冲区pBuf中
2.3接收过程
进行串口配置时,规定当串口接收缓冲区中有多于或等于1个字符时将引发OnComm事件,对应的接收程序流程如图2所示。
正确读取文件名及文件内容后,按照所选路径创建新的文件,默认文件名为收到的文件名,也可修改。将文件内容写入文件,完成文件保存。在接收过程中,设置进度条用以显示接收进度。应用的主要函数如下:
CFilesavefile(m_savefilePath,CFile::modeCreate|CFile:: modeWrite); //在所选路径下调用构造函数创建一个新文件,打开文件并写入数据
savefile.Write(result,strlen(result));//将恢复出的文件内容写入文件,strlen()表示计算内容大小
savefile.Close();//关闭文件
2.4文件夹和文件显示
若接收文件的文件名不为空,则表示已经收到文件。点击“打开所在文件”按钮,显示保存接收文件所在的文件夹。点击“打开文件”按钮,显示接收文件。应用的主要函数如下:
ShellExecute(NULL,"open",m_revfolderPath, NULL,NULL, SW_SHOWNORMAL);//打开文件夹,m_revfolderPath表示接收文件所在文件夹路径
ShellExecute (NULL,"open",m_savefilePath, NULL, NULL, SW_SHOWNORMAL);//打开文件,m_savefilePath表示文件路径
2.5界面设计与操作流程
2.5.1界面设计
程序界面包括串口设置、发送文件和接收文件,如图3所示。在进行初始化时,向串口号下拉框中添加数据COM1~COM9,波特率下拉框中添加数据9 600~115 200;發送文件部分用只读编辑框显示发送文件路径,进度条显示发送进度;接收文件部分用只读编辑框显示接收文件路径,进度条显示接收进度。
2.5.2操作流程
①通信双方在通信前应设置相同的串口波特率,P900无线串口通信模块的空中信息传输速率为115 200 bps,因此设置串口波特率都为此值,串口号依据各自通信模块占用的端口号为准,该号可在设备管理器的端口选项中进行查询。点击“打开串口”按钮,串口被打开,串口号和波特率2个组合框变为只读,按钮上的文本显示为“关闭串口”,若再点击该按钮,则串口关闭,串口号和波特率2个组合框变为可编辑,按钮上的文本显示为“打开串口”。
②点击“打开文件”按钮,选择要发送的文件,弹出发送文件对话框,点击确定,则打开文件,文件名显示框中显示将要发送文件的路径。点击“发送文件”按钮,若串口处于关闭状态,则弹出警告窗口,若串口处于打开状态,则发送该文件,进度条显示发送进度,当发送完成时,弹出发送完成提示。
③接收端接收到文件后,弹出是否接收的提示窗口,若取消,则不接收;若同意,则表示接收文件,弹出保存文件对话框,点击保存,则保存该文件。进度条显示接收进度,接收完成后,弹出文件已保存提示。
④点击“打开所在文件夹”按钮,弹出文件所在文件夹;点击“打开文件”按钮,显示文件。
3结束语
利用配置P900无线串口通信模块的计算机作为无线串口数据收发终端,避免了有线连接的局限性。在Visual C++2010环境下,进行软件设计与编程,用MSComm串口通信控件解决该版本难以直接进行串口通信的问题。通信协议灵活且简单易懂。试验结果表明,该设计采用可实现稳定可靠的远距离文件传输,取得了良好的应用效果。
参考文献
[1]王保印,康健,姜传国.用VC++6.0中MSComm控件实现多类型文件传送[J].吉林大学学报(信息科学版),2004(2): 164-168.
[2]邬金松,李广彪.PC机和单片机之间文件传输[J].舰船电子工程,2005(4):83-85.
[3]戴楠,孙长国,刘志宏.基于CC1110的无线串口通信系统设计与实现[J].计算机与网络,2010,36(21):68-70.
[4]王正强.VC中应用MSComm控件实现串口通信[J].电子测试,2010(5):73-76.
[5]赵邦信.利用通信控件进行串口文件传送时的可视化程序设计[J].现代电子技术,2001(7) :18-21.
[6]王春媚.多串口并行通信数据传输系统设计[J].现代电子技术,2017(4) :86-90.