叶帆工作室

嵌入式开发爱好者(十年开发经验,精通C/C++/VC/VB/C#...)

刘洪峰ID:yefanqiu
503768次访问,排名80好友0人,关注者136
微软MVP / CSDN 2008十大MVB/MSDN中文技术论坛版主
yefanqiu的文章
原创 215 篇
翻译 0 篇
转载 3 篇
评论 1057 篇
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
最近评论
yefanqiu:知道这个软件,不过更深层次知识我目前也不清楚。
吴为仁:请问你熟悉神奇的Reflector软件吗?用它可以得到.NET的源码。请问Reflector输出的源码与真正的源码有什么区别?要注意那些问题?您这个MVP写一点此方面的东西,可否?
yefanqiu:在C#上直接调用该控件吧。
yefanqiu:这是支持两种不同字符集的函数(ANSI/Unicode)
jingang123gz:我用C#怎么写代码捏???
文章分类
收藏
    相册
    叶帆照片
    【叶帆软件】
    [01]VB源码之友(V2.1.548)
    [02]API浏览器.net(V5.0)
    [03]叶帆成语词典(V2.0.8)
    [04]叶帆密码库(V1.2.8)
    【叶帆资源】
    DAO 2.0引擎
    叶帆快速通道
    Windows Embedded 专题
    中文MSDN
    叶帆圈子--工业自动化
    叶帆工作室(博客园)
    叶帆工控--工业自动化
    叶帆群组--工业应用开发
    微软中文技术论坛
    瑞康社区论坛
    叶帆友情链接
    张欣
    枕善居
    莫依
    葛涵涛
    郑建
    陈辉
    马宁
    马骐
    魏涛序
    黎波
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 .Net Micro Framework研究—TCP/IP通信收藏

    新一篇: .Net Micro Framework研究—模拟器改造 | 旧一篇: .Net Micro Framework研究—串口操作

    试验平台: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

     

    发表于 @ 2007年10月30日 08:55:00|评论(loading...)|编辑

    新一篇: .Net Micro Framework研究—模拟器改造 | 旧一篇: .Net Micro Framework研究—串口操作

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 叶帆