Microsoft  CSIP   WindowsMobile   MEDC   合作伙伴   体验中心 设为首页 加到收藏夹

 
登录       点击换一张     注册新用户 找回密码

.Net Micro Framework研究—TCP/IP通信
2007年11月01日03:53   编辑:叶帆工作室 来源: 叶帆工作室 浏览: 410

  试验平台:Digi MF开发板

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

  如果仅仅运行一下示例程序,那显然不过瘾!既然串口实现了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驱动程序

  2、  再配置IO连接变量

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

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

    查看评论

请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。 本站拥有管理笔名和留言的一切权利。
相关文章推荐
· 浅谈Morse Code与.NET Micro Framework 2007-11-1  breakstring
· Visual Studio 2005 Sp1 Beta 和 .NET Micro Framework 2007-9-18  维生素C.NET
· 齐头评论.NET Micro Framework与J2ME CLDC 2007-5-21  郭长佑

  

论坛推荐  
热点活动
更多»

© CSIP 信息产业部软件与集成电路促进中心 All Rights Reserved 版权所有 京ICP备06020771号
联系电话:010-63951881-8003 王先生        邮件:wangj@csip.org.cn