开发者社区> KB小秘书> 正文

【.Net MF网络开发板研究-06】以太网转串口

简介: 有的模块还支持直接用TCP或UDP进行连接,不同端口号对应不同的串口,这样编程可以达到一个比较高的数据吞吐量(我在上个公司用Moxa 5630模块开发隧道广告的数据通信时,就遇到类似问题,也就是最大限度地提高单位时间的数据吞吐量)。
+关注继续查看

以太网转串口是工控领域最常见的智能通信模块,有的是一网口转1串口,有的是一网口转4串口,最多的可以达到一转16串口(好像有的最多可以支持32串口)。如果该类模块做的足够完善,可以提供一个windows系统的设备驱动,安装后,在windows系统上就可以看到虚拟出的串口了。不过这样做,虽然简便了开发,但是性能有些问题,所以有的模块还支持直接用TCP或UDP进行连接,不同端口号对应不同的串口,这样编程可以达到一个比较高的数据吞吐量(我在上个公司用Moxa 5630模块开发隧道广告的数据通信时,就遇到类似问题,也就是最大限度地提高单位时间的数据吞吐量)。

现在我们就用.NET MF网络开发板做一个一网口转1串口示例演示。

简单期间,网络部分的代码,我们可以借用《Socket编程之服务端》中介绍的代码,串口部分的代码,我们可以参考《远程PLC读写控制》和《PC通过Modbus协议远程操控开发板》中的串口代码来进行改写。

核心代码如下:

       public ProcessClientRequest(Socket clientSocket, Boolean asynchronously)

        {

            sp.Open();

            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

            //--

            m_clientSocket = clientSocket;

            if (asynchronously)  // Spawn a new thread to handle the request.

                new Thread(ProcessRequest).Start();

            else ProcessRequest();

        }

        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {         

            if (sp.BytesToRead > 0)

            {

                byte[] bytData = new byte[sp.BytesToRead];

                sp.Read(bytData, 0, bytData.Length);

                string s = new string(System.Text.UTF8Encoding.UTF8.GetChars(bytData));

                System.TinyGUI.Graphics.Print("<<< " + s + "\r\n"); //显示串口接收的数据

                m_clientSocket.Send(bytData);     //把串口接收的数据通过网络发送出去            

            }

        }

        private void ProcessRequest()

        {

            const Int32 c_microsecondsPerSecond = 1000000;

            // 'using' ensures that the client's socket gets closed.

            using (m_clientSocket)

            {

                while (true)

                {

                    // Wait for the client request to start to arrive.

                    Byte[] buffer = new Byte[1024];

                    if (m_clientSocket.Poll(5 * c_microsecondsPerSecond, SelectMode.SelectRead))

                    {

                        // If 0 bytes in buffer, then the connection has been closed,

                        // reset, or terminated.

                        if (m_clientSocket.Available == 0) return;

                        // Read the first chunk of the request (we don't actually do

                        // anything with it).

                        Int32 bytesRead = m_clientSocket.Receive(buffer, m_clientSocket.Available, SocketFlags.None);

                        byte[] bytData = new byte[bytesRead];

                        Array.Copy(buffer, bytData, bytData.Length);

                       

                        string s = new string(System.Text.UTF8Encoding.UTF8.GetChars(bytData));

                        System.TinyGUI.Graphics.Print(">>> "+s+"\r\n");  //显示网络接收的数据                    

                        //---------------------------

                        if (sp.IsOpen)

                        {

                            sp.Write(bytData, 0, bytData.Length); //通过串口发送出去

                            sp.Flush();

                        }

                        //---------------------------

                    }

                }

      }

把代码部署开发板后执行,我们直接用我们的TCP Client工具进行测试(下载地址如下:http://www.sky-walker.com.cn/MFRelease/Tools/YFTCPClient.rar)。

打开任意一个串口调试工具,设置波特率115200,准备和TCP Client进行通信。

(开发板有两个串口,其中COM1我们把它设为Debug口,所以不能使用了,我们用的是COM2口)。

测试过程图如下:
image.png

       

可以看出TCP Client工具所发出的信息,串口调试助手已经收到,同样,串口调试助手所发的数据,TCP Client也可以收到。

此时开发板运行状态图如下:
image.png

      

其实,我们比较“牛”一点的是一个网口可以转6个串口(其中一个连接Zigbee,一个是RS485,还带若干IO)的物联网网关模块(如下图),该系统基于STM32F207,正在调试过程中。
image.png

     

 ---------------------------------------------------------------------------------------------------------------------------------------------

本文源码:http://www.sky-walker.com.cn/MFRelease/Sample/YFMFTCP2Serialport.rar

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

官方网站:http://www.sky-walker.com.cn/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
科普达人丨漫画图解什么是eRDMA?
绕过CPU,将数据直接从一台计算机的内存传输到另一台计算机,进行网络加速
23 0
金鱼哥RHCA回忆录:DO447构建高级作业工作流--创建工作流作业模板并启动工作流作业
第十章 构建高级作业工作流--创建工作流作业模板并启动工作流作业
6 0
Python高级——搞几个静态Web服务器
Python高级——搞几个静态Web服务器
10 0
什么是IGMP?IGMP与ICMP有啥区别?
IGMP 代表 Internet 组播管理协议,是 IPv4 网络上的主机和相邻路由器用来建立多播组成员资格的通信协议,当多播主机希望加入特定多播组并开始接收组流量时,IGMP 消息主要用于向其本地多播路由器发送信号,IGMP有三个版本:版本1、版本2、版本3。
43 0
TCP状态转换图文解说
TCP状态转换图文解说
5 0
网络编程——基本名词术语解析
网络编程——基本名词术语解析
6 0
Linux IO多路转接——UDP通信
Linux IO多路转接——UDP通信
7 0
Linux本地套接字(IPC)
Linux本地套接字(IPC)
6 0
Apache配置虚拟主机
Apache配置虚拟主机
8 0
+关注
1091
文章
1262
问答
来源圈子
更多
阿里云最有价值专家,简称 MVP(Most Valuable Professional),是专注于帮助他人充分了解和使用阿里云技术的意见领袖阿里云 MVP 奖项为我们提供了这样一个机会,向杰出的意见领袖表示感谢,更希望通过 MVP 将开发者的声音反映到我们的技术路线图上。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载