高分求串口服务器编程知识(急)

高分求串口服务器编程知识(急),第1张

什么是串口服务器

随着Internet的广泛普及,“让全部设备连接网络”已经成为全世界企业的共识。为了能跟上网络自动化的潮流,不至于失去竞争优势,必须建立高品位的数据采集、生产监控、即时成本管理的联网系统。利用基于TCP/IP的串口数据流传输的实现来控制管理的设备硬件,无需投资大量的人力、物力来进行管理、更换或者升级。

串口服务器就使得基于TCP/IP的串口数据流传输成为

了可能,它能将多个串口设备连接并能将串口数据流进行选择和处理,把现有的RS 232接口的数据转化成IP端口的数据,然后进行IP化的管理,IP化的数据存取,这样就能将传统的串行数据送上流行的IP通道,而无需过早淘汰原有的设备,从而提高了现有设备的利用率,节约了投资,还可在既有的网络基础上简化布线复杂度。串口服务器完成的是一个面向连接的RS 232链路和面向无连接以太网之间的通信数据的存储控制,系统对各种数据进行处理,处理来自串口设备的串口数据流,并进行格式转换,使之成为可以在以太网中传播的数据帧;对来自以太网的数据帧进行判断,并转换成串行数据送达响应的串口设备。

1、 硬件系统

硬件系统是实现整个系统功能的基础,是整个设计实现的关键。

整个串口服务器的关键在于串口数据包与TCP/IP数据报之间的转换以及双方数据因为速率不同而存在的速率匹配问题,在对串口服务器的实现过程中,也必须着重考虑所做的设计和所选择的器件是否能够完成这些功能。

1.1 硬件系统组成模块

在制定设计方案和选定器件时遇到的技术难点是如何利用处理器对串口数据信息进行TCP/IP协议处理,使之变成可以在互联网上传输的IP数据包。目前解决这个问题很多时候采用32位MCU + RTOS方案,这种方案是采用32位高档单片机,在RTOS(实时多任务操作系统)的平台上进行软件开发,在嵌入式系统中实现TCP/IP的协议处理。它的缺点是:单片机价格较高,开发周期较长;需要购买昂贵的RTOS开发软件,对开发人员的开发能力要求较高。

借鉴上述方案的优缺点,我们决定把串口服务器的硬件部分分为几个模块设计,这就是主处理模块、串口数据处理模块和以太网接口及控制模块等几大模块来共同完成串口服务器的功能。

在器件的选择上,选用Intel公司的801086芯片作为主处理模块的处理器芯片,它是一种非常适合于嵌入式应用的高性能、高集成度的16位微处理器,功耗低。由于考虑到串口数据速率较低而以太网的数据传输速率高所造成的两边速率不匹配的问题,我们决定采用符合总线规范的大容量存储器来作为数据存储器;由于主处理模块还涉及到数据线/地址线复用、串并转换、器件中断信号译码、时钟信号生成、控制信号接入等功能,若是选用不同的器件来完成,势必会造成许多诸如时延不均等问题,我们选用了一片大容量的高性能可编程逻辑器件来完成上述所提到的功能,这样的优点在于,我们保证了稳定性和高可靠性,并且可编程逻辑器件的可编程功能使得对于信号的处理的空间更大,且具有升级的优势。

以太网接口及控制模块在串口服务器的硬件里面起着很重要的作用,它所处理的是来自于以太网的IP数据包,考虑到通用性的原则,我们采用一片以太网控制芯片来完成这些功能,并在主处理模块中添加了一片AT24C01来存储以太网控制芯片状态。通过主处理模块对于以太网控制芯片数据及寄存器的读/写,我们可以完成对IP数据包的分析、解/压包的工作。

串口数据处理模块主要完成的是对于串口数据流的电平转换和数据格式的处理,判断串行数据的起始位及停止位,完成对数据和校验位的提取。一般的设计采用的是MAX232和一片UART的设计思想,这里我们也是遵从这种设计理念,不过我们采用的是集成了MAX232+UART功能的芯片,小尺寸、低成本、低功耗,而且采用与SPITM/QS-PITM/MICROWIRETM兼容的串行接口,节省线路板尺寸与微控制器的I/O端口。

这种模块化的方案的优点在于:采用高速度的16位微控制器,外围器件少,系统成本低;并且采用Intel公司的开发平台,可以大幅度地缩短开发周期并降低开发成本。

1.2 硬件工作流程及应用架构

主处理器首先初始化网络及串口设备,当有数据从以太网传过来,处理器对数据报进行分析,如果是ARP(物理地址解析)数据包,则程序转入ARP处理程序;如果是IP数据包且传输层使用UDP,端口正确,则认为数据报正确,数据解包后,将数据部分通过端口所对应的串口输出。反之,如果从串口收到数据,则将数据按照UDP格式打包,送入以太网控制芯片,由其将数据输出到以太网中。可以知道,主处理模块主要处理TCP/IP的网络层和传输层,链路层部分由以太网控制芯片完成。应用层交付软件系统来处理,用户可以根据需求对收到的数据进行处理。

2、硬件系统模块

根据硬件系统的具体结构和不同功能,我们可以将硬件系统划分为下述的几大模块。

2.1主处理器模块

该模块是串口服务器的核心部分,主要由主处理器、可编程逻辑器件、数据及程序存储器等器件构成。

主处理模块完成的功能主要有:在串口数据和以太网IP数据之间建立数据链路;通过对以太网控制芯片的控制读写来实现对IP数据包的接收与发送;判别串行数据流的格式,完成对串口设备的选择以及对串行数据流格式的指定;控制串口数据流与IP数据包之间的速率控制,对数据进行缓冲处理;对UART和以太网控制芯片的寄存器进行读写操作,并存储转发器件状态;完成16位总线数据的串并行转换;完成总线地址锁存功能;完成对各个串口以及各个存储器件的片选功能;完成对各个串口的中断口的状态判别等功能。

2.2 以太网接口及控制模块

这个模块主要由以太网接口部分和以太网控制部分构成。

以太网接口部分完成的是串口服务器与以太网接口电路的功能,控制器对所有模块均有控制作用,使整个接口电路能协调地配合后续电路完成以太网的收发功能。

以太网控制部分由收端和发端组成,在他们之间还有以太网状态检测和控制单元,以及收发协调控制器,见图5。由于以太网是半双工工作的,所以这个部分必须随时地监视以太网的状态,并且要根据需要对以太网进行控制,同时还要协调好内部收发端电路的工作状态。以太网检测单元和收发协调控制器就是完成这样的功能的。以太网状态检测单元与以太网接口的控制器接口,将接口的状态送到收发协调控制器,同时将协调控制器的控制信号进行处理,并送到以太网接口的控制器,以控制接口的状态。

在收端,接收到的串行数据流信号通过主处理模块进行串并转换和编码,以太网控制单元控制各部分协调,将产生的地址、数据、写信号送到RAM读写控制单元进行处理。相应的,发端的工作流程和收端相反。

2.3 串口数据处理模块

该模块主要完成串口设备的状态收集、串行数据流的接收和数据格式的解/封包工作,由8片UART和对应的串口接口构成。前面我们已经说明了各个端口的寻址方式,当主处理模块寻址某个端口时,由主处理模块读写相应的UART的寄存器,判定相连接的串口设备的空闲状态,并与之建立通信连接,发回控制数据帧给主处理器,主处理器收到控制信号后,再决定是否发送和接收数据流。

3、硬件系统流程

在串口服务器中,硬件部分与软件部分相结合完成整个系统的功能,用户通过软件部分的可视化界面和C/S架构的监控模式来完成对串口设备的控制与管理;硬件部分完成串行数据与IP数据包之间的格式转换以及控制信号的处理。

显示的是串口服务器硬件在系统流程的内部数据流向图。因为在整个串口服务器的系统中,硬件完成数据格式转换以及控制信号处理等主要功能,软件系统与硬件系统遵循一个标准的接口,在这个接口之上来传递数据信号和控制信号,串口服务器的状态信息主要由中央服务器来处理和收集,由于服务器完成的只是一些状态存储和转发,所以与原来的串口设备—前置机模式有很大区别,中央服务器也不需要负担太多的工作。

4、应用领域

串口服务器可以将各企事业单位的串口设备接入以太局域网实现资源共享,在通信、交通、学校、金融、税务、保险等行业都有广泛的用途。

 1、直连

  所谓直连就是将计算机上的网线口与串口服务器上的以太网口直接相连,该组网方式布线简单,可以实现较长距离传输,较长距离传输的实现。是因为从计算机到串口服务器的距离增大。网线的制作与一般的上网用的网线接线相同。通过虚拟串口管理软件将串口服务器上的串口映射为COM3、COM4等,便可像普通串口一样对其进行操作。对于串口服务器来说,如果将其TTL串口增加MAX485芯片就成为RS422或RS485,同样可以将其映射为COM3、COM4。等,所以对于上位机来说不管串口服务器以什么样的串口方式输出,其操作方式与对计算机自身的COM1、COM2口的操作方式一样,大大简化了上位机的编程工作量然而,串口服务器真正的优势以及价值的体现并不是表现在直连方式的应用上,将设备连接到以太网上是它重要的目的。

2、以太网连接

  通过串口服务器将串口设备连接到以太网上,其接线方式非常简单,只需要将串口服务器连接到路由器或者交换机上即可,通过设置串口服务器的IP。地址(XUNWEI品牌的产品默认是动态获取DHCP打开的,可以自动获取IP地址),就可使串口服务器成为以太网上的一个节点,从而使连接到该串口服务器的设备连接到以太网上,通过该组网方式能够将不同的设备,将不同形式的串口。(如TTL、RS232、RS485和RS422),连接到以太网上,实现异构组网。该组网方式可以将整个公司的设备连接到网络上,在组网过程中,除了可以利用交换机和路由器扩展外,还可以利用工业以太网交换机,扩展不同型号的串口服务器,实现设备的灵活组网,工作人员可以分权限、分级别对设备进行监控,从公司领导、总工、技术负责人到普通操作员在自己的权限内都可以对系统进行监控,实现了网络资源的共享和对所有系统的集中管理,为网络制造技术搭建平台。

1、新建MFC对话框工程如下

2、给编辑框控件添加变量,其中Edit Box添加Value变量,Button添加Control变量,ID和变量分别为:

IDC_BTNOPEN()                                  CButton m_cBtnOpen

IDC_BTNSEND()                                  CButton m_cBtnSend

IDC_EDIT_RXDATA()                          CString m_sRXDATA

IDC_EDIT_TXDATA()                           CString m_sTXDATA

3、右击插入Active X控件:

右击电话图标选择“Class Wirzard”,添加变量m_comm1,添加Function:

双击两个Button按钮;

代码中显示如下:

[cpp] view plain copy print?

void CMSCommTestDlg::OnBnClickedBtnopen()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnBnClickedBtnsend()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnOncommMscomm1()

{

// TODO: Add your message handler code here

}

void CMSCommTestDlg::OnBnClickedBtnopen()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnBnClickedBtnsend()

{

// TODO: Add your control notification handler code here

}

void CMSCommTestDlg::OnOncommMscomm1()

{

// TODO: Add your message handler code here

}

5、将上面代码补全如下:

[cpp] view plain copy print?

void CMSCommTestDlg::OnClickedBtnopen()

{

// TODO: Add your control notification handler code here

//如果端口已经开启,那么先关闭

if (m_comm1.get_PortOpen())

{

m_comm1.put_PortOpen(FALSE)

}

m_comm1.put_CommPort(3)                //选择com3,可以根据具体情况更改

m_comm1.put_InBufferSize(1024)         //设置输入缓冲区的大小,Bytes

m_comm1.put_OutBufferSize(1024)        //设置输出缓冲区的大小,Bytes

m_comm1.put_Settings(_T("9600,n,8,1")) //波特率9600,无校验,8个数据位,停止位1

m_comm1.put_InputMode(1)               //1:表示以二进制方式检索数据

m_comm1.put_RThreshold(1)              //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_comm1.put_InputLen(0)                //设置当前接收区长度是0

if (!m_comm1.get_PortOpen())

{

m_comm1.put_PortOpen(TRUE)

}

else

{

AfxMessageBox(_T("Can not open serial port!"))

}

m_comm1.get_Input()                    //先预读缓冲区以清除残留数据

UpdateData(FALSE)

}

void CMSCommTestDlg::OnClickedBtnsend()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE)

m_comm1.put_Output(COleVariant(m_sTXDATA))//发送数据

}

void CMSCommTestDlg::OnOncommMscomm1()

{

// TODO: Add your message handler code here

VARIANT variant_inp

COleSafeArray safearray_inp

LONG len, k

BYTE rxdata[2048]

CString strtemp

if (m_comm1.get_CommEvent() == 2)       //事件值为2表示缓冲区内有字符

{

variant_inp = m_comm1.get_Input()  //读缓冲区

safearray_inp = variant_inp        //VARIANT型变量转换为ColeSafeArray型变量

len = safearray_inp.GetDim()       //得到有效数据长度

for (k = 0 k < len k++)

{

safearray_inp.GetElement(&k, rxdata + k)//转换为BYTE型数组

}

for (k = 0 k < len k++)            //将数组转换为CString型变量

{

BYTE bt = *(char*)(rxdata + k) //字符型

strtemp.Format(_T("%c"), bt)   //将字符送入临时变量strtemp存放

m_sRXDATA += strtemp           //接收到的数据放到编辑框对应的变量中

}

}

SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA)

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/633009.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-18
下一篇2023-07-18

发表评论

登录后才能评论

评论列表(0条)

    保存