串口转以太网模块上位机配置软件
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
[键入文字]
本科毕业
论文
政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载
、毕业设计
题 目 串口转以太网模块
_上位机配置软件设计 系 别 __电子信息工程系_______ 专 业 ___电子信息工程________ 年 级 _____ ____________
学 号 ___ _________
姓 名 _____ ____________ 指导教师 _____ __________
年 月 日
串口转以太网模块上位机配置软件设计
摘要
以太网具有通信速率高、价格低廉、软硬件产品丰富等优点,而在工业或商业通信设备中,更多的却是符合RS232
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的串行口设备,考虑到成本问题,以往设备不可能全部淘汰,因此就需要一种设备把RS232、RS485接口的数据流转化成以太网数据流,提供串口转网络功能,这样就可以让串口设备立即联接网络。采用这种
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,无需淘汰原先的串口设备,甚至可以实现多台设备同时入网,既可以提高设备利用率,还可在已有的网络基础上简化布线复杂度。串口转以太网,并不是简单物理层和数据链路层的转化。由于串口协议本身不具有网络层和传输层,串口转以太网,实际上是将串口的数据作为TCP/IP的应用层数据,用TCP/IP封装传输的方式。TCP/IP的应用层数据是TCP/IP所要传送的真正有效的数据。本设计主要完成串口转以太网模块上位机配置软件设计,首先要设计一个用于对串口转以太网模块进行配置的PC端图形界面应用程序,可配置参数包括:串口通信波特率、校验位、数据位、停止位,网络参数工作模式、IP地址、端口、子网掩码、网关地址、目的 IP 或域名、目的端口等。在Visual Studio下利用应用程序向导创建基于对话框的应用程序,Visual Studio是目前最流行的 Windows平台应用程序开发环境,然后制定与转换模块的配置通信协议,支持与转换模块用串口或网络接口进行连接。
关键词: 以太网 TCP/IP 串口 图形界面 通信协议
I
目 录
摘要 ........................................................................ I 1 绪论 ...................................................................... 1
1.1 课题研究的背景及意义 ................................................ 1
1.2 课题的发展现状 ...................................................... 1
1.3 本文研究的主要内容 .................................................. 1 2 总体方案分析 .............................................................. 3
2.1 软件总体结构 ........................................................ 3
2.2 软件总体流程 ........................................................ 3 3 软件用户图形界面设计 ...................................................... 5
3.1 开发环境介绍 ........................................................ 5
3.2 用户界面设计 ........................................................ 5 4 配置软件的通信程序设计 ................................................... 12
4.1 参数说明 ........................................................... 12
4.2 通信协议 ........................................................... 12
4.3 实现与转换模块的通信 ............................................... 14 5 系统测试结果 ............................................................. 20
5.1 串口转以太网模块上位机配置软件设计结果 ............................. 20
结论 ....................................................................... 22 参考文献 ................................................................... 23 附录一 ..................................................................... 24 附录二 ..................................................................... 27 附录三 ..................................................................... 29 附录四 ..................................................................... 31 致谢 ....................................................................... 33
II
1 绪论
1.1 课题研究的背景及意义
与RS232/485串口通信相比较,以太网通信距离远,而RS-232串口通信的距离就只有15M, RS-485通信距离就只有1200M。以太网通信质量稳定,不受外部环境干扰。在以太网技术蓬步普及于工业通信的今天,各种以太网串口通信方案被广泛应用到工业领域中(国内比较有名的以太网串口通信解决方案提供商有台湾的MOXA公司和P&S公司等公司。随着以太网在商业、工业领域的广泛应用,用户与供应商迫切需要在任何时间都可以访问数据和对数据进行控制,在任何地点都可以做到远程故障处理与分析。针对这种情况,
[1]采用串行通信转网络通信数据模块就是解决这些问题的最佳解决方案。 1.2 课题的发展现状
以太网是用于本地和广域网应用、定义完善的标准,目前它已在多个工业综合自动化
[2]系统中的资源管理层、制造执行层得到了普遍应用。在工业数据传输领域、POS支付领
[3]域、安防监控领域、物联网领域广泛应用。
在使用串口转以太网转换器过程中发现了一些能在传统RS-232(或RS-485)口上正常运行的软件却不能正常运行,因此就有虚拟串口不是真正的串口这一说法。如果串口通信软件内有对COM口的直接I/O读写语句,那么肯定无法在以太网/串口转换器的串口上运行。这就是某些通信软件在“传统RS-232口”可以运行而在以太网/串口转换器的虚拟RS-232口上不能够运行的原因。即使这样,我们依然认为用以太网/串口转换器的虚拟串口代替传统的RS-232、RS-485、RS-422口是必然的发展趋势,就象PCI总线代替ISA总线、Windows代替DOS一样。从我们使用的情况看,以太网/串口转换器的虚拟串口的通用性远远强于USB/串口转换器的虚拟串口,原因可能是由于以太网的信号线是全双工的,也就是以太网收、发信号分开的并且可以同时收发。Windows操作系统从来不是优先考虑工业通信和工业测控的实时性要求,反而越来越抛弃工业通信和工业测控 。
在人们的日常工作生活中,基于以太网技术和TCP/IP协议构建的互联网已被广泛应用,人们可以更方便快速的查阅消息,共享消息等等。相信不久的将来,随着网络的进一
[4]步发展和普及,以太网技术将会得到跟普遍的应用。
1.3 本文研究的主要内容
本课题主要介绍了串口转以太网模块上位机配置软件设计,它以Visual Studio2005
为开发环境,采用C++编程结合。
1
针对研究的主要内容,所需要做的工作如下: (1)熟悉软件编程语言C++和Visual Studio开发环境。 (2)熟悉PC端图形界面应用程序。
(3)制定串口与以太网配置通信协议。
(4)熟练串口和以太网接口配置通信程序。
2
2 总体方案分析
2.1 软件总体结构
本设计主要研究串口转以太网模块上位机配置软件设计,对串行通信转网络通信数据
[5][6]模块进行软件设计,其上位机配置部分的总体结构如图2-1所示。
串口转以太网模块上位机配置
设计软件用户图制定与转换模块的
形界面 配置通信协议
支持与转换模块用支持与转换模块用
串口进行连接 以太网接口进行连
接
图 2-1 总体结构图
设计一个用于对串口转以太网模块进行配置的PC端图形界面应用程序。可配置参数包括:串口通信波特率(串口波特率最高115200bps)、校验位、数据位、停止位,网络
[7]参数(工作模式、IP地址、端口、子网掩码、网关地址、目的IP或域名、目的端口),分包规则(数据包长度、数据包间隔、帧首字符、帧尾字符)等。 2.2 软件总体流程
在MicroSoft Visual Studio 下利用MFC应用程序向导创建基于对话框的应用程序,然后获取用户输入的数据,并对用户输入的数据进行检验,再设置一组缺省值,最后调用CserialPort类或socket编程实现与转换模块的通信。总体软件流程图如图2-2所示。
3
用户输入数据的获取
GetDlgItem
用户输入数据的检验
缺省值的设置 调用CserialPort类实现与转用socket编程实现与
转换模块的通信 换模块的通信
图 2-2 总体软件流程图
4
3 软件用户图形界面设计
3.1 开发环境介绍
集成开发环境一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。本设计是在Visual Studio2005下用MFC设计一个用于对串口转以太网模块进行配置的PC端图形界面。
MFC是一个微软公司提供的类库,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
3.2 用户界面设计
打开MicroSoft Visual Studio集成开发环境,新建项目,在项目类型MFC中选择MFC应用程序,定义名字为TCP,在应用程序类型中选择基于对话框。利用应用程序向导创建基于对话框的应用程序,向导会生成两个基本的类。如果应用程序的名称为TCP,那么两个类为CTCPApp和CTCPDlg。
CTCPApp为程序运行的基础,它使程序在Windows下可以运行多个实例。
CTCPDlg是对话框类。应用程序向导同时为他所创建的每一个目标类编写了相应的消息映射。因此程序的消息相应代码就十分容易加到程序中去。这样就加快了基于对话框应用程序设计的效率。
3.2.1 软件主界面
打开对话框资源IDD_TCP_DIALOG,该对话框将是程序运行时的主界面,接下来就开始
[8]添加控件,完成控件添加后的主对话框如图3-1所示。
5
图 3-1 程序主对话框设计图
主对话框中的主要控件属性介绍:
按钮(Button):在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。本设计用到3个Button控件,分别用来发送配置、取消配置发送、缺省配置。
编辑框(Edit Box):用来接收用户输入的字符串、数字等。本设计的一些网络参数(IP地址、子网掩码、网关等)都用到Edit Box控件。
组合框(Combo Box):列表框和编辑框的组合,用户可以输入多种选择。本设计的一些串口通信参数(波特率、校验位、数据位、停止位)用到Combo Box控件。
静态文本(Static Text):一般用来标识附近另一个控件的内容。显示在静态文本控件中的字符串一般不再改变,但是在需要的时候,也可以通过调用相应的函数来进行设置。
6
组成框(Group Box):用来包围具有逻辑关系的一组控件,在这些控件的周围加
上边界和标题。为了使界面看起来比较清晰、明显,需要用Group Box控件分开。但
本设计组成框仅仅是在视觉效果上对控件进行成组。
主对话框中的主要控件如表3-2所示。
表 3-2 主对话框中的主要控件
控件类型 控件ID 名称 Button IDCANCEL 取消 Button IDCANCEL2 发送配置 Button IDC_BUTTON1 缺省配置 Combo Box IDC_COMBO 可选串口号数据 Combo Box IDC_COMBO1 可选波特率数据 Combo Box IDC_COMBO2 可选校验位数据 Combo Box IDC_COMBO3 可选数据位数据 Combo Box IDC_COMBO4 可选停止位数据 Combo Box IDC_COMBO5 可选工作模式数据 Combo Box IDC_COMBO6 可选传送方式数据 Edit Control IDC_EDIT1 模块IP地址编辑框 Edit Control IDC_EDIT2 模块子网掩码编辑框 Edit Control IDC_EDIT3 模块网关数据编辑框 Edit Control IDC_EDIT4 数据包长度编辑框 Edit Control IDC_EDIT5 数据包间隔编辑框 Edit Control IDC_EDIT6 帧首字符编辑框 Edit Control IDC_EDIT7 帧尾字符编辑框 Edit Control IDC_EDIT8 IP地址编辑框 Edit Control IDC_EDIT9 端口编辑框 Edit Control IDC_EDIT10 模块端口编辑框 Edit Control IDC_EDIT11 目的IP或域名编辑框 Edit Control IDC_EDIT12 目的端口编辑框 Static Text IDC_STATIC 串口号 Static Text IDC_STATIC 波特率 Static Text IDC_STATIC 校验位 Static Text IDC_STATIC 数据位 Static Text IDC_STATIC 停止位 Static Text IDC_STATIC 工作模式 Static Text IDC_STATIC 传送方式 Static Text IDC_STATIC 模块IP地址 Static Text IDC_STATIC 模块子网掩码 Static Text IDC_STATIC 模块网关 Static Text IDC_STATIC 数据包长度 Static Text IDC_STATIC 数据包间隔
7
续表 ,,,
Static Text IDC_STATIC 帧首字符
Static Text IDC_STATIC 帧尾字符
Static Text IDC_STATIC IP地址
Static Text IDC_STATIC 端口
Static Text IDC_STATIC 模块端口
Static Text IDC_STATIC 目的 IP 或域名
Static Text IDC_STATIC 目的端口
Group Box IDC_STATIC19 串口设置
Group Box IDC_STATIC20 网络设置
Group Box IDC_STATIC21 分包规则
3.2.2 用户输入数据的获取、检验
(1)主界面添加完控件后,用GetDlgItem这个函数获取用户输入的数据,如果对话
框中的控件为Combo Box,获取组合框里用户选择的数据的代码如下: ((CComboBox*)GetDlgItem(IDC_COMBO))->GetCurSel();
[9]如果对话框中的控件为Edit Box,获得编辑框里用户输入的数据的代码如下: CString str;
GetDlgItem(IDC_EDIT)->GetWindowText(str);
CString str1("192.168.0.2"); GetDlgItem(IDC_EDIT1)->GetWindowText(str1);
(2)本设计还需要对用户输入的IP地址、子网掩码、网关等数据进行检验。自定义
一个函数Judgment_IP,用来判断IP地址范围的正误,函数返回值:正确为1,错误为0。
[10]部分代码如下:
int section = 0; //每一节的十进制值
int dot = 0; //几个点分隔符
int last = -1; //每一节中上一个字符
if(dot > 3)
{
return 0;
} //判断点分隔符的个数
if(section >= 0 && section <=255) {
section = 0;
} //判断每节的值的范围
数据的检验流程图如图 3-3 所示。
8
图 3-3 数据的检验流程图
通过设置对输入数据的检验,当用户输入错误的IP地址时,显示图 3-4 发送格式错误图。
9
图 3-4 发送格式错误图
3.2.3 缺省配置的设置
[11]设置一组默认值,使用户无需选择,系统自动提供的一组配置。 如果对话框中的控件为Combo Box,设置组合框显示的内容如下代码: ((CComboBox*)GetDlgItem(IDC_COMBO))->SetCurSel(0); //设置0为显示的内容 如果对话框中的控件为Edit Box,设置Edit显示的内容用如下代码: CString str ("100");
GetDlgItem(IDC_EDIT)->SetWindowText(st4); // 设置CEdit显示为100 设置的缺省配置值如图 3-5所示。
10
图 3-5 缺省值图
11
4 配置软件的通信程序设计
4.1 参数说明
串口转以太网模块上的参数说明如表4-1所示。
表 4-1 参数说明表
串口参数
衡量通信速度的参数,它表示每秒钟传送的bit的个数。支持的波特率有:4800、9600、波特率 14400、19200、38400、56000、57600、115200。
串口通信中一种简单的检错方式。支持的校验位有:None、Odd、Even、Mark、Space 五校验位 种方式。
数据位 衡量通信中实际数据位的参数。支持的数据有:5,6,7,8。
停止位 用于表示单个包的最后一位,支持 1、1.5、2 位停止位。
分包规则
串口转以太网模块的串口在收到该长度数据后,将已接收数据作为一帧发送到网络数据包长度 上。
当模块接收的数据出现停顿,且停顿时间大于该时间时,将已接收的数据作为一帧发数据包间隔 送到网络上。
帧首字符 如果串口数据流中出现帧首字符,之前接收的数据将被作为一帧发送到网络上。
如果串口数据流中出现帧尾字符,之前接收的数据加上帧尾字符被作为一帧发送到网帧尾字符 络上。
网络参数
有TCP Server(TCP 服务器模式)、TCP Client(TCP 客户端模式)、UDP 模工作模式 式。设置为TCP Server 时,网络服务器需要主动连接模块;设置为TCP Client
时,模块主动向目的IP 指定的网络服务器发起连接
IP 地址 本模块的IP 地址。
端口 本模块处于 TCP Server 或UDP 模式时的监听端口。 子网掩码 必须与本地子网掩码相同。
网关 必须与本地网关相同
目的IP或域名 在TCP Client或UDP模式下,数据将发往目的IP或域名指示的计算机。 目的端口 在 TCP Client 或UDP 模式下,数据将发往目的IP 的目的端口。 4.2 通信协议
把配置好的波特率、校验位、数据位、停止位、工作模式编成数字码(0、1、2、3、4、5、6、7)发送出去,数据包长度、数据包间隔、帧首字符、帧尾字符、IP地址、端口、网关、目的IP或域名、目的端口根据用户的需要,输入正确的数据。
以$为开始符,#为结束符,其间的每一项配置的参数用逗号隔开。上位机配置的参数
12
发送到模块的协议如表 4-2 所示。
表 4-2 协议表
0 1 2 3 4 5 6 7
波特率 4800 9600 14400 19200 38400 56000 57600 115200
校验位 None Odd Even Mark Space
数据位 5 6 7 8
停止位 1 1.5 2
工作 TCP TCP UDP 模
模式 Server Client 式
数据包长度 串口收到的数据的长度
数据包间隔 数据帧中字符间发送的时间间隔
帧首字符 数据帧的第一个字符
帧尾字符 数据帧的最后一个字符
IP 地址 本模块的IP 地址
端口 本模块的端口
网关 本模块的网关
目的 IP 或域名 目的IP地址
目的端口 目的端口
(1)串口配置通信协议
串口通信最重要的参数是波特率、数据位、停止位和校验位。对于两个进行通信的端口,这些参数必须匹配。串口通信波特率最高115200bps。串行接口收发字符位数是可配置的,可以是5、6、7、8 位,如何设置取决于你想传送的信息,比如,标准的ASCII码是0,127(7位),扩展的ASCII码是0,255(8位)。停止位典型的值为1,1.5和2位,停止位不仅仅是表示传输的结束,还校正时钟同步的机会,因为可能在通信中两台设备间出现了小小的不同步。有四种检错方式:奇、偶、低和高,当然没
[12]有校验位也是可以的。串口转以太网模块的串口在收到该长度数据后,将已接收数据作为一帧发送到网络上,帧首字符为起始位,起始位后用两个字符表示目标地址。帧尾字符作为结束标志,结束标志前两个字符是校验码。消息帧中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。
(2)网络配置通信协议
串口转以太网实际上就是将串行通信协议转化为网络通信协议,能够将串行通信数据转化为网络数据包发出,将收到的网络数据包用串行通信的方式传输,实现透明
[13]传输。
有两种基本实际模型,一种是上行链路,如图 4-3 所示。
13
串口接收
数据缓冲区
网口发送
图 4-3 上行链路图
另一种是下行链路,如图 4-4 所示。
网口接收
数据缓冲区
串口发送
图 4-4 下行链路图
模块内部都支持一定数量的数据缓冲区。上行链路原理就是串口接收到数据帧,存储到数据缓冲区单元,然后经过网口发送单元,发送到目的地址。下行链路原理就
[14]是经过网口接收到的数据,存储到数据缓冲区单元,然后经过串口发送。 4.3 实现与转换模块的通信
4.3.1 用串口实现与转换模块的通信
[15]调用CserialPort类:这个类完成读、写和监视一个串口通信端口,它是一个非常好用的串口编程工具。
(1)构造函数CserialPort()
主要完成该类的成员变量的初始化。
(2)初始化串行端口函数InitPort()
这个函数完成串行端口通信参数的设置,如需要打开的端口号、波特率、奇偶校验位、数据位、停止位。
14
BOOL CSerialPort::InitPort(CWnd* pPortOwner, // 接收数据端口所属窗口
UINT portnr, // 串口号 (1..4)
UINT baud, // 波特率
char parity, // 校验位
UINT databits, // 数据位
UINT stopbits, // 停止位
DWORD dwCommEvents, // 通信事件
UINT writebuffersize) // 写缓冲区大小
(3)启动串行端口通信监视线程StartMonitoring()
该函数是启动串口通信监视线程,它在串口初始化完成后调用。
BOOL CSerialPort::StartMonitoring()
{
if (!(m_Thread = AfxBeginThread(CommThread, this)))
return FALSE;
TRACE("Thread started\n");
return TRUE;
}
(4)挂起或者停止串行端口通信监视线程StopMonitoring()
该函数在程序结束时调用来关闭串行端口通信监视线程,调用该函数后,串口资源仍然被占用。
BOOL CSerialPort::StopMonitoring()
{
TRACE("Thread suspended\n");
m_Thread->SuspendThread();
return TRUE;
}
(5)向串口发送字符WriteToPort()
void CSerialPort::WriteToPort(char* string)
以上就是CserialPort类常用的函数介绍。将改好的类文件SerialPort.cpp和SerialPort.h复制到工程所在的文件夹中,再分别添加到项目的源文件和头文件中,并在TCPDlg.h中将SerialPort.h说明:#include "SerialPort.h"。通过以上步骤,就在当前
[3]工程中加入了CserialPort类。并在源文件TCPDlg.cpp加上如下的代码,即可以实现用串口与转换模块的通信。
if(Com=((CComboBox*)GetDlgItem(IDC_COMBO6))->GetCurSel()==0)
{
15
if(com.InitPort(this,1,9600,'N',8,1,1,1024))
com.StartMonitoring();
else
{
MessageBox("COM打开失败~");
return;
}
str.Format(_T("$%d,%d,%d,%d,%d"),Baud,Parity_bit,Date_bit,Stop_bit,
work_patten);
MessageBox(str+str4+","+str5+","+str6+","+str7+","+str13+","+str1+","+str
10+","+str2+","+str3+","+str11+","+str12+"#");
com.WriteToPort(str+str4+","+str5+","+str6+","+str7+","+str13+","+str1+",
"+str10+","+str2+","+str3+","+str11+","+str12+"#");
com.ClosePort();
}
串口通信流程图如图 4-5 所示。
构造函数
CserialPort()
初始化串行端口
InitPort()
启动串行端口通信监视线程
StartMonitoring()
挂起或者停止串行端口通信监视线程
StopMonitoring()
通过串口发送字符
WriteToPort()
图 4-5 串口通信流程图
16
通过串口发送的配置显示如图 4-6 串口配置成功图。
图 4-6 串口配置成功图
如果串口通信的波特率、数据位、停止位和校验位不匹配, 则会显示如图 4-7 串口打开失败图。
图 4-7 串口打开失败图
17
4.3.2 用网络实现与转换模块的通信
[16]用socket编程实现网络通信,首先需要链接一个ws2_32.lib的库文件:在TCPDlg. cpp中写上#pragma comment(lib, "ws2_32.lib ")。
客户端操作socket:
(1)加载套接字库(WSAStartup())
在初始化阶段调用WSAStartup(),在程序中调用该函数的形式如下: WSAStartup( wVersionRequested, &wsaData );wVersionRequested = MAKEWORD( 1, 1 )
表示我用的是WinSocket1.1版本, wsaData用来存储系统传回的关于WinSocket的资料。
(2)建立socket
初始化WinSocket的动态连接库后,需要建立一个监听的socket,为此可以调用socket()函数:
SOCKET sockClient=socket(int af,int type,int protocol);af目前只提供AF_INET,要建立的是遵从TCP/IP协议的socket,所以type为SOCK_STREAM,第三个参数如 果不指定通信协议则定为0。
(3)绑定端口
接下来要为定义的这个监听的socket指定一个地址和端口,这样客户端才知道待会要连接哪个地址的哪个端口。
(4)向服务器发出连接请求
向服务器发出连接请求函数。 ,就要使用connect()
(5)和服务器端进行通信
接下来就可以实现通信,用send()函数实现数据发送。
(6)关闭套接字,关闭加载的套接字库
结束客户端和服务器端的通信连接用closesocket()函数;另外与程序启动时调用WSAStartup()函数相对应,程序结束时需要调用WSACleanup()来释放socket所占用的资源。
在源文件TCPDlg.cpp加上修改的socket编程代码,本设计是客户端,则在服务器端选择合适的IP地址和端口,即可以实现用网络与转换模块的通信。
网络通信流程图如图 4-8 所示。
18
加载套接字库
WSAStartup()
建立socket
绑定端口
向服务器发出连接请求
connect()
和服务器端进行通信
send()
关闭套接字 closesocket()
关闭加载的套接字库
WSACleanup()
图 4-8 网络通信流程图 通过网络发送的配置显示如图 4-9 网络配置成功图所示。
图 4-9 网络配置成功图
19
5 系统测试结果 5.1 串口转以太网模块上位机配置软件设计结果
在软件用户图形界面上选择一组配置的参数,如表5,1所示。
表 5-1 配置的一组参数值表
波特率 9600 校验位 None
数据位 8 停止位 1
数据包长度 100 帧首字符 8
数据包间隔 1 帧尾字符 7
工作模式 UDP 模式
IP 地址 125.125.125.12
端口 4432
子网掩码 125.125.125.1
网关 125.125.125.2
目的 IP 或域名 125.125.125.8
目的端口 2314
串口程序编写完成后,将串口线连接好,打开串口调试助手,并设置相匹配的COM1,9600,8,1。单击“发送”按钮,即可实现用串口与转换模块通信。发送的配置的参
数显示在串口调试助手的接收区。如图 5-2 串口实现配置显示图所示。
图 5-2 串口实现配置显示图
20
网络程序编写完成后,将网线连接好,打开网络调试助手,协议类型选择TCP服务器类型,写好本地的IP地址和端口号,即可实现与转换模块用网络接口进行连接。发送的配置的参数显示在网络调试助手的接收区。如图 5-3 网络实现配置显示图所示。
图 5-3 网络实现配置显示图
21
结论
通过这次的毕业设计,对于在Visual Studio环境下的编程能力有了进一步的提高,我是选择用C++语言编写,虽然先前没接触过C++语言,但学过C语言,入手比较容易,很快就掌握了C++的基础知识,逐步提高了C++程序设计能力。
(1)本设计是在Visual Studio 下设计一个用于对串口转以太网模块进行配置的PC端图形界面应用程序,获取和检验用户输入的数据以及缺省值的设置。
(2)制定了与转换模块的配置通信协议,串口通信最重要的参数是波特率、数据位、停止位和校验位,以太网接口参数有IP地址、子网掩码、网关地址等,了解各个参数可以比较容易的制定与转换模块的配置通信协议。
(3)本设计还调用了CserialPort类实现用串口与转换模块的通信,用socket编程实现用网络与转换模块的通信。应用socket编程时总是调试不出来,原来首先需要链接一个ws2_32.lib的库文件才能实现网络通信。
通过这次毕业设计,提高了查阅文献资料、
设计规范
民用建筑抗震设计规范配电网设计规范10kv变电所设计规范220kv变电站通用竖流式沉淀池设计
以及程序设计等能力,培养了解决问题的思路和方法。程序设计对我来说是比较有难度的,因为以前接触比较少,而且很难思考。在老师精心细致的辅导下,我渐渐入门了,编写、编译、调试程序这一系列过程令我感到无比充实。
经过这次系统的毕业设计,我熟悉了对串口转以太网模块上位机配置这一项课题进行研究、设计和调试的详细过程,加深了解了串口转以太网模块在现实生活中的应用,也培养了自己严肃认真和实事求是的科学态度,培养了吃苦耐劳的精神以及相对应的工程意识。本设计只是研究上位机配置,整体串口转以太网模块还需进一步研究,相信前景广阔。
22
参考文献
[1] 范炜,徐洪泽.基于TCP/IP协议的嵌入式多串口网关的设计[J].计算机工程与设计,
2008,29(1):1-10.
[2] 马文学.基于工业以太网的火电厂电气自动化系统应用研究[D].广州:华南理工大学,2005:11-21. [3] Adrian Bachofen.Integrating Industrial Ethemet And Internet[M].Industrial Ethernet Book,
1997:31-37.
[4] 丁继东. 基于ARM处理器的串行通信与以太网协议的研究与应用[D].上海:华东师范大学
,2005:14-27.
[5] 蔡长安,钟锐,王盈瑛.串行通信转网络通信数据模块的设计[J].计算机应用与软件,2010,27(1):
88-91.
[6] 刘庆敏,田岚.串行通信转网络通信的数据终端研究[J].单片机与嵌入式系统,2007,(6):35-37. [7] 谢希仁.计算机网络[M].北京:电子工业出版社,2007:79-83.
[8] 谭思亮,邹超群.Visual C++串口通信工程开发实例[M].北京:电子工业出版社,2003:140-147. [9] 周仲宁.C++程序设计与应用[M].北京:机械工业出版社,2009:11-18.
[10] 钱能.C++程序设计教程[M].北京:清华大学出版社,1999:145-171.
[11] 谭浩强.C++面向对象程序设计[M].北京:清华大学出版社,2006:88-94.
[12] Philips Semiconductors.Universal Serial Bus Transceiver PD USB-DP11AD[M]. Product da
Ta,1999:22-28.
[13] 缪学勤.实时以太网技术现状与发展[J].上海工业自动化仪表研究所,2002,33(4):21-26. [14] 阎维国,王敏杰.基于以太网和TCP/IP的通信技术研究[J].大连理工学报,2003,23(1):2-4. [15] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:人民邮电出版社,2004:30-32. [16] 李媛媛.Visual C++网络通信开发入门与编程实践[M].北京:电子工业出版社,2008:17-29.
23
附录一
用户输入数据的获取、检查
void CTCPDlg::OnBnClickedCancel2()
{
int Com=((CComboBox*)GetDlgItem(IDC_COMBO6))->GetCurSel(); int Port=((CComboBox*)GetDlgItem(IDC_COMBO))->GetCurSel(); int Baud=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel(); int Parity_bit=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel(); int Date_bit=((CComboBox*)GetDlgItem(IDC_COMBO3))->GetCurSel(); int Stop_bit=((CComboBox*)GetDlgItem(IDC_COMBO4))->GetCurSel(); int work_patten=((CComboBox*)GetDlgItem(IDC_COMBO5))->GetCurSel(); CString str4,str5,str6,str7,str1,str10,str2,str3,str11,str12; GetDlgItem(IDC_EDIT4)->GetWindowText(str4);
GetDlgItem(IDC_EDIT5)->GetWindowText(str5);
GetDlgItem(IDC_EDIT6)->GetWindowText(str6);
GetDlgItem(IDC_EDIT7)->GetWindowText(str7);
GetDlgItem(IDC_EDIT1)->GetWindowText(str1);
GetDlgItem(IDC_EDIT10)->GetWindowText(str10);
GetDlgItem(IDC_EDIT2)->GetWindowText(str2);
GetDlgItem(IDC_EDIT3)->GetWindowText(str3);
GetDlgItem(IDC_EDIT11)->GetWindowText(str11);
GetDlgItem(IDC_EDIT12)->GetWindowText(str12);
if((this->Judgment_IP(str2.GetBuffer())==0) |
(this->Judgment_IP(str3.GetBuffer())==0)|
(this->Judgment_IP(str1.GetBuffer())==0))
{
MessageBox("发送格式错误~");
return;
}
int CTCPDlg::Judgment_IP(char *ip)
{
int section = 0;
int dot = 0;
24
int last = -1;
while(*ip)
{
if(*ip == '.')
{
dot++;
if(dot > 3)
{
return 0;
}
if(section >= 0 && section <=255)
{
section = 0;
}
else
{
return 0;
}
}
else if(*ip >= '0' && *ip <= '9')
{
section = section * 10 + *ip - '0';
if(last == '0')
{
return 0;
}
}
else
{
return 0;
}
last = *ip;
ip++;
}
if(section >= 0 && section <=255)
25
{
if(3 == dot)
{
section = 0;
return 1;
}
}
return 0; }
26
附录二
缺省配置的设置并默认用串口发送
void CTCPDlg::OnBnClickedButton1()
{
((CComboBox*)GetDlgItem(IDC_COMBO6))->SetCurSel(0); ((CComboBox*)GetDlgItem(IDC_COMBO))->SetCurSel(0); ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(1); ((CComboBox*)GetDlgItem(IDC_COMBO2))->SetCurSel(0); ((CComboBox*)GetDlgItem(IDC_COMBO3))->SetCurSel(3); ((CComboBox*)GetDlgItem(IDC_COMBO4))->SetCurSel(0); ((CComboBox*)GetDlgItem(IDC_COMBO5))->SetCurSel(2);
CString str4("100");
CString str5("1");
Cstring str6("EF");
CString str7("01");
CString str1("192.168.0.2");
CString str10("8888");
CString str2("255.255.255.0");
CString str3("192.168.0.1");
CString str11("192.168.0.3");
CString str12("8889");
GetDlgItem(IDC_EDIT4)->SetWindowText(str4); GetDlgItem(IDC_EDIT5)->SetWindowText(str5); GetDlgItem(IDC_EDIT6)->SetWindowText(str6); GetDlgItem(IDC_EDIT7)->SetWindowText(str7); GetDlgItem(IDC_EDIT1)->SetWindowText(str1); GetDlgItem(IDC_EDIT10)->SetWindowText(str10); GetDlgItem(IDC_EDIT2)->SetWindowText(str2); GetDlgItem(IDC_EDIT3)->SetWindowText(str3); GetDlgItem(IDC_EDIT11)->SetWindowText(str11); GetDlgItem(IDC_EDIT12)->SetWindowText(str12); if(com.InitPort(this,1,9600,'N',8,1,1,1024)) com.StartMonitoring();
27
else
{
MessageBox("COM打开失败~");
return;
}
MessageBox("$1,0,3,0,"+str4+","+str5+","+str6+","+str7+",2,"+str1+","+str10+","+str2+","+str3+","+str11+","+str12+"#");
com.WriteToPort("$1,0,3,0,"+str4+","+str5+","+str6+","+str7+",2,"+str1+","+str10+","+str2+","+str3+","+str11+","+str12+"#");
com.ClosePort();
}
28
附录三
对话框中灰色控件的设置
void CTCPDlg::OnCbnSelchangeCombo6() {
if(((CComboBox*)GetDlgItem(IDC_COMBO6))->GetCurSel()==0)
{
GetDlgItem(IDC_EDIT8)->EnableWindow(false); GetDlgItem(IDC_EDIT9)->EnableWindow(false); }
else
{
GetDlgItem(IDC_EDIT8)->EnableWindow(true); GetDlgItem(IDC_EDIT9)->EnableWindow(true); }
if(((CComboBox*)GetDlgItem(IDC_COMBO6))->GetCurSel()==1)
{
((CComboBox*)GetDlgItem(IDC_COMBO))->EnableWindow(false);
}
else
{
((CComboBox*)GetDlgItem(IDC_COMBO))->EnableWindow(true);
}
}
void CTCPDlg::OnCbnSelchangeCombo5() {
if(((CComboBox*)GetDlgItem(IDC_COMBO5))->GetCurSel()==1)
{
GetDlgItem(IDC_EDIT10)->EnableWindow(false); }
else
{
GetDlgItem(IDC_EDIT10)->EnableWindow(true); }
29
if(((CComboBox*)GetDlgItem(IDC_COMBO5))->GetCurSel()==0)
{
GetDlgItem(IDC_EDIT11)->EnableWindow(false);
GetDlgItem(IDC_EDIT12)->EnableWindow(false); }
else
{
GetDlgItem(IDC_EDIT11)->EnableWindow(true);
GetDlgItem(IDC_EDIT12)->EnableWindow(true); }
}
30
附录四
网络通信的程序
WORD wVersionRequested;
WSAData wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
str.Format(_T("$%d,%d,%d,%d,"),Baud,Parity_bit,Date_bit,Stop_bit);
str13.Format(_T("%d"),work_patten);
MessageBox(str+str4+","+str5+","+str6+","+str7+","+str13+","+str1+","+str1
0+","+str2+","+str3+","+str11+","+str12+"#");
Str=str+str4+","+str5+","+str6+","+str7+","+str13+","+str1+","+str10+","+s
tr2+","+str3+","+str11+","+str12+"#";
char *data;
data = (char*)(LPCTSTR)str;
send(sockClient,data,str.GetLength()+1,0);
closesocket(sockClient);
WSACleanup();
31
}
}
32
致谢
。。。。。。
33