.Net Micro Framework研究—TCP/IP通信

简介: 关于网络通信方面,Digi提供了两个程序,一个是TCP Server运行在Digi的开发板上,一个是TCP Client程序,运行在PC上,通过网络,上位机很容易控制Digi开发的IO信号

试验平台:Digi MF开发板

关于网络通信方面,Digi提供了两个程序,一个是TCP Server运行在Digi的开发板上,一个是TCP Client程序,运行在PC上,通过网络,上位机很容易控制Digi开发的IO信号。客户端程序运行后的界面如下:
image.png

如果仅仅运行一下示例程序,那显然不过瘾!既然串口实现了Modbus Rtu协议,那么网口就实现Modbus Tcp协议吧,实现的Modbus Tcp协议比我们用串口实现Modbus Rtu的指令要多一个,不仅实现了3号命令,也实现了16号命令,这样我们就可以通过Modbus Tcp读写Digi开发板的数据了。这次我们操作的是Digi开发板上的5个LED灯。用OutputPort对象去操作。

操作GPIO的相关代码如下:

//读GPIO信号

DataBuff[0] = 0;

DataBuff[1] = (byte)((output[0].Read() ? 1 : 0) | (output[1].Read() ? 2 : 0) | (output[2].Read() ? 4 : 0) | (output[3].Read() ? 8 : 0) | (output[4].Read() ? 16 : 0));

//写GPIO信号

bool[] bFlag = new bool[5];

bFlag[0]=(DataBuff[1] & 0x01)>0 ? true:false;

bFlag[1]=(DataBuff[1] & 0x02)>0 ? true:false;

bFlag[2]=(DataBuff[1] & 0x04)>0 ? true:false;

bFlag[3]=(DataBuff[1] & 0x08)>0 ? true:false;

bFlag[4]=(DataBuff[1] & 0x10)>0 ? true:false;

for (i = 0; i < 5; i++)

{

   output[i].Write(bFlag[i]);

}

 

网络操作相关源码如下:

using System;

using Microsoft.SPOT;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading;

using Microsoft.SPOT.Hardware;

 

namespace MFModbusTcp

{

    public class ModbusTcpSlave

    {

        //MF开发板 IO灯

        private OutputPort[] output=new OutputPort[5];

        Cpu.Pin[] pin = new Cpu.Pin[5] { (Cpu.Pin)0, (Cpu.Pin)1, (Cpu.Pin)2, (Cpu.Pin)5, (Cpu.Pin)6 };

        private Socket socketServer;

        private Socket s = null;

 

        //变量缓冲区

        private byte[] m_bytData = new byte[256];

        private byte[] m_InputTCPBuf = new byte[1024];

        private byte[] m_OutputTCPBuf = new byte[1024];

        public byte[] DataBuff = new byte[1024];

       

        //启动Modbus Tcp服务

        public void Run()

        {

            //初始化 GPIO

            for (int i = 0; i < 5; i++)

            {

                output[i] = new OutputPort(pin[i], false);

            }

            socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socketServer.Bind(new IPEndPoint(DottedDecimalToIp(0, 0, 0, 0), 502));

            socketServer.Listen(1);

            Debug.Print("Modbus Tcp Slave Started");

            while (true)

            {

                s = socketServer.Accept();

                while (s != null)

                {

                    if ((int)s.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Error) != 0) goto ExitServer;

                    if (s.Available > 0)

                    {

                        TCP_DealwithCommand();

                    }            

                    Thread.Sleep(10);

                }

            }

         ExitServer:

            s.Close();

            s = null;

            Debug.Print("Modbus Tcp Slave Exit");

        }

 

        //数据解析

        private void TCP_DealwithCommand()

        {

            int i = 0;

            int lngSendNum = 0;

            int lngDataNum = 0;

            int lngDataAddr = 0;

 

            //接收数据

            int intRet=s.Receive(m_InputTCPBuf);

            //Debug.Print("Receive Num:" + intRet.ToString());

            for (i = 0; i < 12; i++) m_OutputTCPBuf[i] = m_InputTCPBuf[i];

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

            //Modbus 读命令

            if (m_InputTCPBuf[7] == 3)

            {

                … …

            }

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

            //Modbus 写命令

            if (m_InputTCPBuf[7] == 16)

            {

                … …

            }

        }

        //IP地址转化

        private long DottedDecimalToIp(byte a1, byte a2, byte a3, byte a4)

        {

            return (long)((ulong)a4 << 24 | (ulong)a3 << 16 | (ulong)a2 << 8 | (ulong)a1);

        }

    }

}

程序部署运行后,我们就可以用标准的Modbus Tcp Client程序测试了,我使用的是YFIOServer。

1、  先配置Modbus Tcp驱动程序

image.png

2、  再配置IO连接变量

image.png

3、  开始读写GPIO,此时GPIO灯的亮灭,完全被写入的数据控制了。

image.png

  

总论:很难想像,操作TCP的代码比C#的代码还要简洁高效,不到十几分钟,就把一个C#代码改造为MF代码,并且在很短的时间内就调试成功。微软的下一个战略看来马上就成为现实:全世界的每一个智能设备都用MF上网J。

相关文章
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
322 4
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
132 1
|
8月前
|
人工智能 机器人
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
155 3
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
192 0
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
481 0
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
|
网络协议 安全 Java
Java网络编程入门指南:TCP/IP协议与Socket通信
Java网络编程入门指南:TCP/IP协议与Socket通信
232 1
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
310 0

热门文章

最新文章