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

简介:

试验平台: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开发板上的5个LED灯。用OutputPort对象去操作。

操作GPIO的相关代码如下:


 
 
  1. //读GPIO信号  
  2.  
  3. DataBuff[0] = 0;  
  4.  
  5. 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));  
  6.  
  7. //写GPIO信号  
  8.  
  9. bool[] bFlag = new bool[5];  
  10.  
  11. bFlag[0]=(DataBuff[1] & 0x01)>0 ? true:false;  
  12.  
  13. bFlag[1]=(DataBuff[1] & 0x02)>0 ? true:false;  
  14.  
  15. bFlag[2]=(DataBuff[1] & 0x04)>0 ? true:false;  
  16.  
  17. bFlag[3]=(DataBuff[1] & 0x08)>0 ? true:false;  
  18.  
  19. bFlag[4]=(DataBuff[1] & 0x10)>0 ? true:false;  
  20.  
  21. for (i = 0; i < 5; i++)  
  22.  
  23. {  
  24.  
  25.    output[i].Write(bFlag[i]);   
  26.  
  27. }  
  28.  
  29.    
  30.  

网络操作相关源码如下:


 
 
  1. using System;  
  2.  
  3. using Microsoft.SPOT;  
  4.  
  5. using System.Net;  
  6.  
  7. using System.Net.Sockets;  
  8.  
  9. using System.Text;  
  10.  
  11. using System.Threading;  
  12.  
  13. using Microsoft.SPOT.Hardware;  
  14.  
  15.    
  16.  
  17. namespace MFModbusTcp  
  18.  
  19. {  
  20.  
  21.     public class ModbusTcpSlave  
  22.  
  23.     {  
  24.  
  25.         //MF开发板 IO灯  
  26.  
  27.         private OutputPort[] output=new OutputPort[5];  
  28.  
  29.         Cpu.Pin[] pin = new Cpu.Pin[5] { (Cpu.Pin)0, (Cpu.Pin)1, (Cpu.Pin)2, (Cpu.Pin)5, (Cpu.Pin)6 };  
  30.  
  31.         private Socket socketServer;  
  32.  
  33.         private Socket s = null;  
  34.  
  35.    
  36.  
  37.         //变量缓冲区  
  38.  
  39.         private byte[] m_bytData = new byte[256];  
  40.  
  41.         private byte[] m_InputTCPBuf = new byte[1024];  
  42.  
  43.         private byte[] m_OutputTCPBuf = new byte[1024];  
  44.  
  45.         public byte[] DataBuff = new byte[1024];  
  46.  
  47.           
  48.  
  49.         //启动Modbus Tcp服务  
  50.  
  51.         public void Run()  
  52.  
  53.         {  
  54.  
  55.             //初始化 GPIO  
  56.  
  57.             for (int i = 0; i < 5; i++)  
  58.  
  59.             {  
  60.  
  61.                 output[i] = new OutputPort(pin[i], false);  
  62.  
  63.             }  
  64.  
  65.             socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  66.  
  67.             socketServer.Bind(new IPEndPoint(DottedDecimalToIp(0, 0, 0, 0), 502));  
  68.  
  69.             socketServer.Listen(1);  
  70.  
  71.             Debug.Print("Modbus Tcp Slave Started");  
  72.  
  73.             while (true)  
  74.  
  75.             {  
  76.  
  77.                 s = socketServer.Accept();  
  78.  
  79.                 while (s != null)  
  80.  
  81.                 {  
  82.  
  83.                     if ((int)s.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Error) != 0) goto ExitServer;  
  84.  
  85.                     if (s.Available > 0)  
  86.  
  87.                     {  
  88.  
  89.                         TCP_DealwithCommand();  
  90.  
  91.                     }               
  92.  
  93.                     Thread.Sleep(10);  
  94.  
  95.                 }  
  96.  
  97.             }  
  98.  
  99.          ExitServer:  
  100.  
  101.             s.Close();  
  102.  
  103.             s = null;  
  104.  
  105.             Debug.Print("Modbus Tcp Slave Exit");  
  106.  
  107.         }  
  108.  
  109.    
  110.  
  111.         //数据解析  
  112.  
  113.         private void TCP_DealwithCommand()  
  114.  
  115.         {  
  116.  
  117.             int i = 0;  
  118.  
  119.             int lngSendNum = 0;  
  120.  
  121.             int lngDataNum = 0;  
  122.  
  123.             int lngDataAddr = 0;  
  124.  
  125.    
  126.  
  127.             //接收数据  
  128.  
  129.             int intRet=s.Receive(m_InputTCPBuf);  
  130.  
  131.             //Debug.Print("Receive Num:" + intRet.ToString());  
  132.  
  133.             for (i = 0; i < 12; i++) m_OutputTCPBuf[i] = m_InputTCPBuf[i];  
  134.  
  135.             //---------------------------------------------------------------  
  136.  
  137.             //Modbus 读命令  
  138.  
  139.             if (m_InputTCPBuf[7] == 3)  
  140.  
  141.             {  
  142.  
  143.                 … …  
  144.  
  145.             }  
  146.  
  147.             //---------------------------------------------------------------  
  148.  
  149.             //Modbus 写命令  
  150.  
  151.             if (m_InputTCPBuf[7] == 16)  
  152.  
  153.             {  
  154.  
  155.                 … …  
  156.  
  157.             }  
  158.  
  159.         }  
  160.  
  161.         //IP地址转化  
  162.  
  163.         private long DottedDecimalToIp(byte a1, byte a2, byte a3, byte a4)  
  164.  
  165.         {  
  166.  
  167.             return (long)((ulong)a4 << 24 | (ulong)a3 << 16 | (ulong)a2 << 8 | (ulong)a1);  
  168.  
  169.         }  
  170.  
  171.     }  
  172.  
  173. }  
  174.  

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

1、  先配置Modbus Tcp驱动程序

 


(图MF071029001.jpg)

2、  再配置IO连接变量

 


(图MF071029001.jpg)

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

 


(图MF071029001.jpg)

 

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



















本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323409,如需转载请自行联系原作者

相关文章
|
3月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
64 1
|
5月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
312 0
|
7月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
58 1
|
3月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
70 3
|
3月前
|
机器学习/深度学习 编解码 算法
【小样本图像分割-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个医学分割数据集上取得了卓越的性能,无需手动调整。该方法强调数据增强、预处理和训练策略等技巧,为医学图像分割提供了一个强大的解决方案。
119 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控件,该如何解决?
|
5月前
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
179 2
|
5月前
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
107 1
|
5月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
6月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用