百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

串口转以太网模块配置软件设计及实现

csdh11 2025-03-02 16:52 11 浏览

摘 要: 采用串口转以太网模块使现有串口设备具备联网功能是一种低成本实用的解决方案。在使用之前,需要根据具体应用环境对串口转以太网模块的串口参数以及网络参数进行设置。对上位机与串口转以太网模块间的通信协议进行了详细阐述,采用UDP广播通信方式,由上位机通过网口对模块进行参数配置。在Visual Studio 2012下,用C#编程实现了一套配置软件。配置过程中,上位机和模块可以跨网段通信,避免需预知模块初始IP以及更改上位机IP地址的麻烦,使用更方便。

0 引言

长期以来,串行通信方式在数据采集、数据监控、安防、医疗等很多领域应用普遍,但随着Internet的发展和应用需求的提升,其局限性也日益凸显:通信距离短、速率低、网络特性差等[1]。同时,物联网的迅猛发展,使得嵌入式设备联网的需求越来越迫切。

淘汰现有串口设备,研发能联网的新产品需要投入大量的时间和人力物力,相比之下,采用串口转以太网技术,只需增加串口转以太网模块,而无需淘汰原先的串口设备,不仅可以提高设备利用率,还可以降低开发成本、缩短开发周期,轻松实现串口设备联网。

串口转以太网,实际就是将串口数据作为TCP/IP的应用层数据,用TCP/IP封装传输[2-3]。本文主要完成串口转以太网模块上位机配置软件的设计,根据上位机和串口转以太网模块间的通信协议,利用UDP广播方式,完成模块的参数配置,方便用户对模块的使用。

1 串口转以太网模块简介

串口转以太网实际上就是将串行通信数据转化为网络数据包发出,将收到的网络数据包用串行通信的方式发出,从而实现串口与网口之间数据的透明传输[4-5]。

本文采用USR-TCP232-E45串口转以太网模块。该模块搭载ARM处理器,采用Cortex-M3内核,内部集成了LWIP协议栈,速度快,功耗低,工作稳定可靠[6]。模块在使用之前需配置的参数包括:串口参数[7](波特率、数据位、校验位、停止位)和网络参数(工作模式、IP地址、端口号、子网掩码、网关等)。

2 通信协议

对串口转以太网模块进行参数配置,需要上位机按照一定的通信协议向模块发送相应命令(数据报文)。

通信协议由报文头、报文长度、报文内容组成,上位机发送的报文在末尾还带1 B的校验码,模块对上位机的响应不带校验,如表1所示。在通信协议中加入校验能够很好地解决传输误码的问题;接收方对收到的数据进行校验,如果校验值不正确,则丢弃本包数据,并通知发送方。

报文头值为0xFF;报文长度为报文内容所占的字节数,由于报文内容不同报文长度也会不同;校验码取报文长度和报文内容各字节之和。报文内容中只有控制码是必需的,用来标识不同的命令操作,MAC地址、用户名密码、参数由于控制码的不同可能不是必需的。

下位机返回的报文与上位机发送的报文格式类似,但是不带校验,响应报文中控制码字段表示本报文是对上位机发出的哪条命令的响应。

发送搜索命令,模块会返回36 B的数据,包括模块的IP地址、MAC地址,之后可以利用MAC地址对该模块进行其他参数的设置。

读取设置,返回256 B,包括基础参数(IP地址、网关、子网掩码、用户名、密码、MAC地址等)和串口参数(串口波特率、数据位、校验位、停止位、流控、本地端口、工作协议等)。

响应报文除了上述必须返回上位机要求的相应参数情况外,还包括对上位机命令的校验及命令的执行情况。

校验错误:′E′+正确的校验值;

命令正确执行:FF 01 CMD′K′;

用户名密码错误:FF 01 CMD′P′;

其他错误:FF 01 CMD ′E′

3 上位机配置软件设计

为了方便跨网段进行配置,所有通信协议的操作均采用UDP广播方式完成。

3.1 UDP广播原理

广播:一个节点发送数据包,网络中的所有节点都可以收到。如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP;其二要知道程序可监听的端口,因为同一主机上的程序使用网络是通过端口号来区分的。

如果想在整个网络中广播数据,要向255.255.255.255发送数据包,这种数据包不会被路由,它只能到达本物理网络中的所有主机,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。广播需要指明接收者的端口号,因为不可能接收者的所有端口都用来收听广播,所以通信时必须保证目标端口号和本地端口号不被占用。

3.2 配置软件的功能设计

配置软件的功能比较单一,需要读取模块的当前设置(IP地址、网关、子网掩码、MAC地址、串口波特率、数据位、校验位、停止位、流控、本地端口、工作协议等)予以显示,并能对这些参数进行设置。

3.3 程序设计及实现

上位机配置软件在Visual Studio 2012开发环境下,采用C#编程实现。C#中对UDP的编程有两种方式:直接使用Socket类和使用UdpClient类[8]。UdpClient类对基础的Socket进行了封装,发送和接收数据时不必考虑底层套接字收发时必须处理的一些细节问题,开发简单、效率较高。因此,本文使用UdpClient类实现对UDP协议的编程。

本文采用了多线程技术,用主线程发送数据,专门启动一个线程用于接收数据,同一个进程中的两个线程可以独立运行并相互通信。

3.3.1 利用UdpClient对象实现UDP通信——数据发送

利用UdpClient对象发送数据的流程如图1所示。

private UdpClient udpClient;

//创建UdpClient对象,这里使用1901端口

udpClient=new UdpClient(1901);

//远程主机及端口号

IPEndPoint iep=new IPEndPoint(IPAddress.Broadcast,1901);

//发送缓冲区

bytesearchDeviceCommand=new byte{0xff,0x01,0x01,0x02};

//通过udpClient将发送缓冲区中的内容发送到远程节点

udpClient.Send(searchDeviceCommand,

searchDeviceCommand.Length,iep);

3.3.2 利用UdpClient对象实现UDP通信——数据接收

利用UdpClient对象接收数据的流程如图2所示。

UdpClient对象的Receive方法用于在指定的本地IP地址和端口上接收远程主机发送的数据报[9]。

private byterBuffer=new byte[256];

//根据通信协议中响应报文的长度,设置合适大小的接收缓冲区(接收缓冲区的大小不能小于模块响应报文的最大长度)

private UdpClient udpClient;

private void FrmConfig_Load(object sender,EventArgs e)

{

udpClient=new UdpClient(1901);//创建接收数据的线程

t=new Thread(startThread);//线程后台运行

t.IsBackground=true;//启动线程

t.Start;

}

//在接收线程中从远程节点接收数据,对数据进行分析处理

private void startThread

{

while(true)

{

IPEndPoint iepRemote=new IPEndPoint(IPAddress.Broadcast,1901);

rBuffer=udpClient.Receive(ref iepRemote);

//对接收缓冲区中的内容进行分析,针对不同命令予以处理

3.4 程序调试

程序调试过程中用到了Wireshark工具。Wireshark是一个网络封包分析软件,通过简单的设置就可以撷取网络封包,并尽可能显示出最为详细的网络封包资料。通过该软件,可以方便地看到上位机配置软件与串口转以太网模块之间数据包的各种信息。

4 结论

采用串口转以太网模块对现有串口嵌入式设备进行升级联网,只需一根网线将模块与PC相连,通过该配置软件就能方便地对模块参数进行设置,操作简单、实用。本文介绍的通信协议以及UDP通信的实现对其他通信应用具有一定的参考价值。

参考文献

[1] 蔡长安,钟锐,王盈瑛.串行通信转网络通信数据模块的设计[J].计算机应用与软件,2010,27(1):88-91.

[2] 李毅.嵌入式串口服务器的设计与实现[D].北京:北京交通大学,2012.

[3] 曾广圣,曾维清,徐冉.一种基于ARM的以太网串口服务器的设计[J].科技广场,2012,25(5):248-253.

[4] 陈政石,秦红波,李铁鹰.基于MSP430F149的串口服务器设计[J].电子技术应用,2009,35(1):95-97.

[5] 成彬,王冬艳,韩宪生,等.密码算法中的循环移位“异或”运算实质性研究[J].微型机与应用,2011,30(11):79-80.

[6] Jinan USR IOT Technology Co.,Ltd. Multifunctional serial to Ethernet module user manual[EB/OL].(2012-07-18)[2014-04-16]. http://www.usriot.com/Down/E45/USR-TCP232- E45-EN%20V1.3.2.pdf.

[7] 朱英翔,朱福民,刘炎鸣.C#下串口通信编程的开发和扩展[J].微型机与应用,2014,33(6):89-91.

[8] 周有杰.Visual C#.Net网络核心编程[M].北京:清华大学出版社,2002.

[9] ROBINSON S.C#高级编程[M].北京:清华大学出版社,2002.

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...