试验平台: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. DataBuff[0] = 0;
  3. 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));
  4. //写GPIO信号
  5. bool[] bFlag = new bool[5];
  6. bFlag[0]=(DataBuff[1] & 0x01)>0 ? true:false;
  7. bFlag[1]=(DataBuff[1] & 0x02)>0 ? true:false;
  8. bFlag[2]=(DataBuff[1] & 0x04)>0 ? true:false;
  9. bFlag[3]=(DataBuff[1] & 0x08)>0 ? true:false;
  10. bFlag[4]=(DataBuff[1] & 0x10)>0 ? true:false;
  11. for (i = 0; i < 5; i++)
  12. {
  13. output[i].Write(bFlag[i]);
  14. }

网络操作相关源码如下:

  1. using System;
  2. using Microsoft.SPOT;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading;
  7. using Microsoft.SPOT.Hardware;
  8. namespace MFModbusTcp
  9. {
  10. public class ModbusTcpSlave
  11. {
  12. //MF开发板 IO灯
  13. private OutputPort[] output=new OutputPort[5];
  14. Cpu.Pin[] pin = new Cpu.Pin[5] { (Cpu.Pin)0, (Cpu.Pin)1, (Cpu.Pin)2, (Cpu.Pin)5, (Cpu.Pin)6 };
  15. private Socket socketServer;
  16. private Socket s = null;
  17. //变量缓冲区
  18. private byte[] m_bytData = new byte[256];
  19. private byte[] m_InputTCPBuf = new byte[1024];
  20. private byte[] m_OutputTCPBuf = new byte[1024];
  21. public byte[] DataBuff = new byte[1024];
  22. //启动Modbus Tcp服务
  23. public void Run()
  24. {
  25. //初始化 GPIO
  26. for (int i = 0; i < 5; i++)
  27. {
  28. output[i] = new OutputPort(pin[i], false);
  29. }
  30. socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  31. socketServer.Bind(new IPEndPoint(DottedDecimalToIp(0, 0, 0, 0), 502));
  32. socketServer.Listen(1);
  33. Debug.Print("Modbus Tcp Slave Started");
  34. while (true)
  35. {
  36. s = socketServer.Accept();
  37. while (s != null)
  38. {
  39. if ((int)s.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Error) != 0) goto ExitServer;
  40. if (s.Available > 0)
  41. {
  42. TCP_DealwithCommand();
  43. }
  44. Thread.Sleep(10);
  45. }
  46. }
  47. ExitServer:
  48. s.Close();
  49. s = null;
  50. Debug.Print("Modbus Tcp Slave Exit");
  51. }
  52. //数据解析
  53. private void TCP_DealwithCommand()
  54. {
  55. int i = 0;
  56. int lngSendNum = 0;
  57. int lngDataNum = 0;
  58. int lngDataAddr = 0;
  59. //接收数据
  60. int intRet=s.Receive(m_InputTCPBuf);
  61. //Debug.Print("Receive Num:" + intRet.ToString());
  62. for (i = 0; i < 12; i++) m_OutputTCPBuf[i] = m_InputTCPBuf[i];
  63. //---------------------------------------------------------------
  64. //Modbus 读命令
  65. if (m_InputTCPBuf[7] == 3)
  66. {
  67. … …
  68. }
  69. //---------------------------------------------------------------
  70. //Modbus 写命令
  71. if (m_InputTCPBuf[7] == 16)
  72. {
  73. … …
  74. }
  75. }
  76. //IP地址转化
  77. private long DottedDecimalToIp(byte a1, byte a2, byte a3, byte a4)
  78. {
  79. return (long)((ulong)a4 << 24 | (ulong)a3 << 16 | (ulong)a2 << 8 | (ulong)a1);
  80. }
  81. }
  82. }

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

1、  先配置Modbus Tcp驱动程序

(图MF071029001.jpg)

2、  再配置IO连接变量

(图MF071029001.jpg)

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

(图MF071029001.jpg)

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

转载于:https://blog.51cto.com/yfsoft/323409

.Net Micro Framework研究—TCP/IP通信相关推荐

  1. 《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...

    第四章      TCP/IP通信案例:访问Internet上的Web服务器 HTTP协议是工作在应用层上的协议,其应用十分广泛,而在进行通信的过程中,经常使用HTTP代理服务器.HTTP代理服务器主 ...

  2. TCP/IP通信程序设计方式

    刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程序,据此一些人可能会认为TCP/IP编程很简单.其实不然,TCP/IP编程具有较为丰富的内容.其编程的丰富性主要体现在通信方式和报文格式的多 ...

  3. TCP/IP 通信示例

    TCP/IP 通信示例 Global String ReadData_P_All$, ReadData_P$(10), data$ ' Global Preserve Double x Global ...

  4. EPSON TCP/IP 通信

    EPSON SCARA机器人TCP/IP 通信时,涉及到的相关指令说明. 14.3 TCP/IP命令. OpenNet //打开TCP/IP端口. ChkNet //返回端口状态:等待读取的字节数或错 ...

  5. .Net Micro Framework研究—实现SideShow窗体界面

    基于MF系统的Windows SideShow界面是非常炫的(如下图).既然微软能用.Net Micro Framework实现这么棒的界面效果,我想我们也能做到. (SideShow模拟器界面和游戏 ...

  6. .Net Micro Framework研究—串口操作

    .Net Micro Framework研究-串口操作 试验平台:Digi MF开发板 Digi提供的示例中包含了串口的示例程序,主要代码如下: public bool EchoByte() { Se ...

  7. Linux内核协议栈分析之——tcp/ip通信并不神秘

    Jack:计算机如何进行通信? 我:我可以告诉你带Linux操作系统的计算机如何进行通信. Jack:带Linux操作系统的计算机?这和不带操作系统的计算机有区别吗? 我:有的. Jack:哦.那你说 ...

  8. MATLAB与DSP(C6657)的TCP/IP通信实现

    最近尝试使用从MATLAB端键入输入,将输入值传给DSP,DSP运算之后将结果传回MATLAB并显示.我所设置的PC的IP地址是192.168.2.101,DSP的IP地址是192.168.2.100 ...

  9. 川崎机器人总线通信_川崎机器人TCP/IP通信方法及编程过程介绍

    川崎机器人的TCP/IP通信除了直接与川崎机器人通信外,有一种方式是通过PLC间接通信,附上我的另一篇文章,讲c#与三菱PLC通信的: 首先假设一个简单的应用情况,有一台带相机的川崎机器人,需要在机器 ...

最新文章

  1. Intellij IDEA 高效使用教程
  2. abb机器人指令手册_ABB机器人编程之程序流程指令(含案例)
  3. C++中用new和不用new定义类的对象的区别解答
  4. android 蓝牙各种UUID (转)
  5. CSU 1558 和与积
  6. 光标是停在文本框文字的最后
  7. 主动风险管理:警报如洪水怎么破?
  8. tcpip详解卷一 pdf_清华大牛爆肝分享网络底层/网络协议/TCP/IP协议详解卷一
  9. 【python】tkinter教程、35个tkinter示例代码和GUI图示
  10. 【ORBSLAM2点线融合】空间直线参数化
  11. 200分高考能上什么计算机学校,高考200分能上什么大学?全在这里!
  12. Composer中的ThingWorx模型定义—可视化
  13. easyuidatagrid更改字体大小
  14. 基于Qt的笛卡尔心形表白程序
  15. (SSM解析错误)$%7BpageContext.request.contextPath%7D/account/save
  16. 【2022最新】手把手教你拥有自己的服务器与网站(无需备案)
  17. FFmpeg[18] - mac解决yasm/nasm not found or too old. Use --disable-yasm for a crippled build.
  18. 【项目三 基于A*算法的迷宫游戏开发】
  19. 使用Java实现建造者模式
  20. 可能四轴,智能车,直升机的一些原理本身就是类似的

热门文章

  1. jquery 悬浮验证框架 jQuery Validation Engine
  2. 【fjwc2015】世界树
  3. s5pv210启动debian出错提示bash: cannot set terminal process group (-1): Inappropriate ioctl for device...
  4. 通过电机编码器AB相输出确定电机转向
  5. h5实现手机端等级进度条
  6. 【转】 java自定义注解
  7. 当你用钥匙开不开门时
  8. 数据分析基础教程Numpy指南笔记
  9. WebView显示的网页在大分辨率屏下被放大--解决方案
  10. 【Storm篇】--Storm基础概念