叶帆工作室

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

刘洪峰ID:yefanqiu
518706次访问,排名80好友0人,关注者161
微软MVP / CSDN 2008十大MVB/MSDN中文技术论坛版主
yefanqiu的文章
原创 216 篇
翻译 0 篇
转载 3 篇
评论 1077 篇
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
最近评论
findg:今天我看见这个网站:http://www.diybl.com/course/6_system/linux/Linuxjs/2007921/72422.html转载了该篇文章,但没有注明文章来源。
dasheng:应该怎样建立监测串口接收数据事件的线程呢。还请指教。
andy:可以给我发一份Dotnet Framework的ppt么?
My E-Mail:caozhongshuai_andy@163.com
真的非常感谢!
@:我防火墙是关了的为撒也还有这情况呢?
superpope1216:叶老师
现在我要用C# 2005开发一个windows mobile 蓝牙打印的功能,请问又什么方法吗?
因为我对蓝牙通信的原理是通过串口什么的不太清楚
还又是否需要调用API函数?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研究—模拟器改造收藏

    新一篇: .Net Micro Framework研究—中文显示 | 旧一篇: .Net Micro Framework研究—TCP/IP通信

           

    试验平台:.Net Micro Framework 模拟器

    由于Digi提供的开发板没有LCD显示屏,所以有关绘图方面的操作,只好在模拟器上进行了。

    如果大家参加了918在北京召开的.Net Micro Framework2007技术大会,并且耐心等到最后,大会的礼品U盘里就有.Net Micro Framework的开发包。

    不过微软这方面对.Net Micro Framework更新很快,如果你到网站上下载,最新的.Net Micro Framework SDK2.0 SP1已经发布了。

    下载链接:http://www.microsoft.com/downloads/details.aspx?familyid=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&displaylang=en

     

    如果你用的是大会优盘的开发包,你会发现,微软真是萝卜快了不洗泥,模拟器不仅粗糙,而且按钮并没有完全拉开,下半截的按钮的圆弧不见了(可参见我以前写的文章:http://blog.csdn.net/yefanqiu/archive/2007/09/18/1790404.aspx)。如果你下载最新的开放包,这个问题已经解决了(看来微软的战略就是快速抢占市场,问题以后在一一修补)。

    无论怎样模拟器还是非常难看,估计n个版本之后,才能推出很漂亮的模拟器。正好微软SDK开发包中,有模拟器外壳的开发程序,所以练练手,给.Net Micro Framework武装一个“顶级模拟器”。

    下面就是我开发的模拟器(应该称外壳)和微软自带的模拟器比较图,我们先睹为快,接下来我就说说是如何做的。 

    (图:MF071030001.jpg 

           .Net Micro Framework SDK中的示例程序里就有一个模拟器外壳开发程序,也就是“SampleEmulator”示例程序,它是一个典型的C#程序(只不过引用了与.Net Micro Framework相关的几个库),你编译成功后,直接运行,它会弹出下面的提示框。

              

        (图:MF071030004.jpg

        其实它是需要输入如下命令行参数的:

        "/load:%ProgramFiles%\Microsoft .NET Micro Framework\v2.0.3036\Assemblies\Microsoft.SPOT.TinyCore.pe" "/load:%ProgramFiles%\Microsoft .NET Micro Framework\v2.0.3036\Assemblies\Microsoft.SPOT.Hardware.pe" "/load:..\..\..\..\TemperatureSample\TemperatureSample\bin\Debug\TemperatureSample.pe" "/load:%ProgramFiles%\Microsoft .NET Micro Framework\v2.0.3036\Assemblies\Microsoft.SPOT.Graphics.pe" "/load:%ProgramFiles%\Microsoft .NET Micro Framework\v2.0.3036\Assemblies\mscorlib.pe" "/load:%ProgramFiles%\Microsoft .NET Micro Framework\v2.0.3036\Assemblies\Microsoft.SPOT.Native.pe"

          

         我们先不管这些,我们希望以后.Net Micro Framework程序运行的时候,加载的是我们的模拟器,所以我们要找出系统模拟器的位置,功夫不负有心人,竟然在这个位置:

         C:\Program Files\Microsoft .NET Micro Framework\v2.0.3036\Tools

         文件名:Microsoft.SPOT.Emulator.Sample.SampleEmulator.exe

         把我们编译好的模拟器程序(最好先和系统自带的有所不同)覆盖掉该程序,运行其它程序试试,果然加载的是我们新生成的模拟器。

         好了,看看我是如何做的。

         其实,微软提供的模拟器外壳程序比较复杂(具体代码请下载开发包后自行查看),所以我不仅要换肤,还要对代码重新进行整理。成绩还是斐然的,如button控件,资源图片等等统统去掉了,仅添加了一个imagelist控件,就在窗体函数里实现了该功能。

           详细代码如下,有兴趣的朋友自己看。

    using System;

    using System.Drawing;

    using System.Threading;

    using System.Windows.Forms;

     

    using Microsoft.SPOT.Emulator;

    using Microsoft.SPOT.Hardware;

    using System.Drawing.Drawing2D;

     

    namespace Microsoft.SPOT.Emulator.Sample

    {

        /// <summary>

        /// This is the UI for the LCD sample

        /// </summary>

        public partial class SampleEmulatorForm : Form

        {

            Emulator _emulator;

            //叶帆添加

            Gpio.GpioPort[] _port=new Microsoft.SPOT.Emulator.Gpio.GpioPort[5];

            delegate void PortWriteDelegate(bool fState);

            int intIndex = 0;

            bool[] _pressed = new bool[] {false,false,false,false,false };

     

            public SampleEmulatorForm(Emulator emulator)

            {

                _emulator = emulator;

                // Initializing the component on the UI form

                InitializeComponent();

            }

            protected override void OnLoad(EventArgs e)

            {

                //Give the buttonCollection focus to allow it to handle keyboard events

                //this.buttonCollection.Select();           

                base.OnLoad(e);

            }

            public void OnInitializeComponent()

            {

                //initialize the lcd control with the lcd emulator component

                this.lcdDisplay.LcdDisplay = _emulator.LcdDisplay;

     

                //叶帆添加

                _port[0] = _emulator.FindComponentById("Pin_Select") as Gpio.GpioPort;

                _port[1] = _emulator.FindComponentById("Pin_Up") as Gpio.GpioPort;

                _port[2] = _emulator.FindComponentById("Pin_Left") as Gpio.GpioPort;

                _port[3] = _emulator.FindComponentById("Pin_Down") as Gpio.GpioPort;

                _port[4] = _emulator.FindComponentById("Pin_Right") as Gpio.GpioPort;

            }

            //按下叶帆添加

            private void picKey_MouseDown(object sender, MouseEventArgs e)

            {

                //OK

                Rectangle rect = new Rectangle(31, 40, 70, 50);

                intIndex = 0;      

                if (rect.Contains(e.X, e.Y))

                {

                    intIndex = 0;

                }

                //UP        

                GraphicsPath path = new GraphicsPath();

                path.AddPolygon(new Point[] {new Point(0,0),new Point(129,0),new Point(100,40),new Point(30,40) });

                if (path.IsVisible(e.X, e.Y))

                {

                    intIndex = 1;

                }

                //LEFT

                path.Reset();

                path.AddPolygon(new Point[] { new Point(0, 0), new Point(0, 130), new Point(31, 90), new Point(31, 40) });

                if (path.IsVisible(e.X, e.Y))

                {

                    intIndex = 2;

                }

                //DOWN

                path.Reset();

                path.AddPolygon(new Point[] { new Point(0, 130), new Point(129, 130), new Point(100, 90), new Point(30, 90) });

                if (path.IsVisible(e.X, e.Y))

                {

                    intIndex = 3;

                }

                //RIGHT

                path.Reset();

                path.AddPolygon(new Point[] { new Point(129, 0), new Point(129, 130), new Point(100, 90), new Point(100, 40) });

                if (path.IsVisible(e.X, e.Y))

                {

                    intIndex = 4;

                }

                picKey.BackgroundImage = imgKey.Images[intIndex+1];

                OnButtonStateChanged(intIndex, true);

            }

            //弹起叶帆添加

            private void picKey_MouseUp(object sender, MouseEventArgs e)

            {

                picKey.BackgroundImage = imgKey.Images[0];

                OnButtonStateChanged(intIndex, false);

            }

            //按下(无法捕捉方向键)

            private void SampleEmulatorForm_KeyDown(object sender, KeyEventArgs e)

            {

            }

            //抬起

            private void SampleEmulatorForm_KeyUp(object sender, KeyEventArgs e)

            {

                picKey.BackgroundImage = imgKey.Images[0];

                OnButtonStateChanged(intIndex, false);

            }

            //捕捉方向键

            protected override bool ProcessDialogKey(Keys keyData)

            {

                switch (keyData)

                {

                    case Keys.Enter:

                        intIndex = 0;

                        break;

                    case Keys.Up:

                        intIndex = 1;

                        break;

                    case Keys.Left:

                        intIndex = 2;

                        break;

                    case Keys.Down:

                        intIndex = 3;

                        break;

                    case Keys.Right:

                        intIndex = 4;

                        break;

                }

                picKey.BackgroundImage = imgKey.Images[intIndex + 1];

                OnButtonStateChanged(intIndex, true);

                return base.ProcessDialogKey(keyData);

            }

     

            //按键状态改变

            private void OnButtonStateChanged(int index,bool pressed)

            {

                if (_port[index] != null)

                {

                    if (_pressed[index] != pressed)

                    {

                        _pressed[index] = pressed;

                        bool val = false;

                        switch (_port[index].Resistor)

                        {

                            case Microsoft.SPOT.Emulator.Gpio.GpioResistorMode.Disabled:

                            case Microsoft.SPOT.Emulator.Gpio.GpioResistorMode.PullUp:

                                val = pressed;

                                break;

                            case Microsoft.SPOT.Emulator.Gpio.GpioResistorMode.PullDown:

                                val = !pressed;

                                break;

                        }

                        //Marshal to MicroFramework thread. 

                        //No need to wait for a response.  Just post the message

                        _port[index].BeginInvoke(new PortWriteDelegate(_port[index].Write), !val);

                    }

                }

            }      

        }

    }

     

    在下面的网站上,我们还可以下载最新的.Net Micro Framework示例程序,其中“NewPresentation”程序比“Presentation”已高了一个层次,如下图: 

        (图:MF071030002.jpg 

    此外这个温度显示的示例程序也不错,我们可以用上下按钮修改温度值,如下图。

                

    (图:MF071030003.jpg

     

    新示例下载链接:  http://msdn2.microsoft.com/en-us/embedded/bb267253.aspx

       

    不过总体来说,示例程序还是很简陋的,有时间我自己做一个最炫的(当然网友有做得更好的,别忘了与我分享)。

     

    附录:经典.Net Micro Framework应用欣赏 

         (图:MF071030005.jpg

    我做的模拟器外壳,就是从上图“偷”来的J,不过按钮单击效果倒是费了我不少周折。

    想想看,用.Net Micro Framework开发MP3/MP4,电子词典该是多么容易和简单,并且效果一定很炫。(上网查了查 Digi核心小模块要$199,几千两银子呢,介入的厂商越多,相信硬件平台一定会越来越便宜的)。

     

    下面是我开发的模拟器下载地址,有兴趣的朋友可以试一试

    http://download.csdn.net/source/274337

     

    发表于 @ 2007年10月31日 20:05:00|评论(loading...)|编辑

    新一篇: .Net Micro Framework研究—中文显示 | 旧一篇: .Net Micro Framework研究—TCP/IP通信

    评论

    #kmlxk 发表于2007-11-04 17:48:17  IP: 222.183.77.*
    o.o 强大~加个键盘就是便携电脑了

    ps:叶总好长没回VB版了~
    #zhizhuxia315 发表于2007-11-04 23:33:38  IP: 222.246.205.*
    新鲜啊!!!!!
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 叶帆