.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。

相关文章
|
19天前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
354 2
|
4月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
297 3
|
30天前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
449 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
2月前
|
C++
提示缺少.NET Framework 3.5 安装错误:0x80070002、0x800F0950\0x80004002
.NET Framework常见问题及解决方法汇总,
383 0
|
3月前
.NET Framework 3.5离线安装包合集下载
本文介绍了如何获取和安装.NET Framework运行库离线合集包。用户可通过提供的链接下载安装包,安装过程简单,按提示逐步操作即可完成。安装时可选择所需版本,工具会自动适配架构,无需手动判断,方便高效。
1334 0
|
4月前
|
C++ Windows
WindowsDLL修复专家,MSVCP**、DLL修复vcruntime**、DLL修复、`.Net Framework`缺失、DirectX类DLL修复、VC运行库修复
Windows DLL修复专家是一款专为解决因DLL文件缺失、版本错误导致的软件或游戏无法运行问题的系统工具。它支持一键扫描和修复各类DLL异常,涵盖MSVCP、vcruntime、.NET Framework、DirectX等多种常见问题。具备自动检测、备份还原功能,确保修复过程安全可靠。适用于软件报错、系统异常及新系统适配场景,降低用户手动修复门槛,提升系统稳定性与兼容性。
168 3
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
349 4
|
域名解析 网络协议
IP协议, TCP协议 和DNS 服务分别是干什么的?
大家好,我是阿萨。昨天讲解了网络四层协议[TCP/IP协议族分为哪4层?]今天我们学习下IP 协议, TCP 协议和DNS 协议分别是干什么的。
460 0
IP协议, TCP协议 和DNS 服务分别是干什么的?
|
网络协议
ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。
ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。
ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。