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

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

试验平台:Digi MF开发板

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

(图MF071029004.jpg

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

(图MF071029001.jpg

2、  再配置IO连接变量

(图MF071029001.jpg

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

(图MF071029001.jpg

  

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

 

相关文章
|
2月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
49 1
|
4月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
267 0
|
2月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
59 3
|
2月前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
《nnU-Net: 自适应框架用于基于U-Net的医学图像分割》是一篇2018年的论文,发表在Nature上。该研究提出了一种自适应的医学图像分割框架nnU-Net,能够自动调整模型的超参数以适应不同的数据集。通过2D和3D U-Net及级联U-Net的组合,nnU-Net在10个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
82 0
【小样本图像分割-4】nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
4月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
148 2
|
4月前
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
89 1
|
4月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
4月前
|
XML JSON 程序员
总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点
总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点
104 0
|
4月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了