.net-人生

倚楼看风雨,笑看人生路……

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  13 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks

2008年1月15日 #

.net Micro framework ---WPF



在开发一般Windows程序时,有VS设计时的支持。然而,我们在开发.net MF的应用程序时,就没有那么幸运了。
在开发.net MF的应用程序时,vs 没有提供设计时的支持,所以我们必须自己写代码创建一个窗体,窗体上添加控件,等。
写代码创建窗体,控件时,需要我们对窗体的层次结构有所了解。
 
  在下面我们创建一个实例,来明窗体创建的过程。

   Windows|-> StackPanel |-> TextFlow
                                     |-> TextFlow
                            |-> ListBox  |->ListBoxItem
        

 

code:

---------------------------------------------------------------------------------------------------------

/*
 *


*filename:   Micro Framework Learning
*作者:wolf
*完成日期:2007.11.8
*功能:  -------------------------
*开发工具:vs2005
 
*/

using System;
using System.Collections;
using System.Threading;

using Microsoft.SPOT;
using Microsoft.SPOT.Input;
using Microsoft.SPOT.Hardware;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Media;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Shapes;

namespace testMFWindowApplication
{
    public class Program : Microsoft.SPOT.Application
    {
  

        private Window mainWindow;

 

        private void OnButtonUp(object sender, ButtonEventArgs e)
        {
            // Print the button code to the Visual Studio output window.
            Debug.Print(e.Button.ToString());
        }
        public static void Main()
        {
            Program myApplication = new Program();

            Window mainWindow = new MainMenuWindow();//myApplication.CreateWindow();

            // Create the object that configures the GPIO pins to buttons.
            GPIOButtonInputProvider inputProvider = new GPIOButtonInputProvider(null);

            // Start the application
            myApplication.Run(mainWindow);
        }
    }
    internal sealed class MainMenuWindow : Window
    {
        private ListBox m_listbox;

        public ListBox MainListBox { get { return m_listbox; } }

        public MainMenuWindow()
          
        {

            Font f = Resources.GetFont(Resources.FontResources.NinaB);

            Color instructionTextColor = ColorUtility.ColorFromRGB(255, 255, 255);
            Color backgroundColor = ColorUtility.ColorFromRGB(0, 18, 0);
            Color unselectedItemColor = ColorUtility.ColorFromRGB(192, 192, 255);   // Unselected listbox item color
            Color selectedItemColor = Colors.Red;                                 // Selected listbox item color

            // The Main window contains a veritcal StackPanel
            StackPanel panel = new StackPanel(Orientation.Vertical);
            this.Child = panel;

            // The top child contains text with instructions
            TextFlow textflow = new TextFlow();
            textflow.TextAlignment = TextAlignment.Left;
            textflow.Visibility = Visibility.Visible;
            textflow.TextRuns.Add(
               new TextRun(Resources.GetString(Resources.StringResources.String1),
               f, instructionTextColor));
            panel.Children.Add(textflow);

            // Add a blank line to the stack
            panel.Children.Add(textflow = new TextFlow());
            textflow.TextRuns.Add(Resources.GetString(Resources.StringResources.Blank), f, instructionTextColor);
            textflow.Visibility = Visibility.Visible;

            // The next child contains a listbox with options
            m_listbox = new ListBox();

            // Prepare the listbox
            Buttons.Focus(m_listbox);
            panel.Children.Add(m_listbox);
            this.Background = m_listbox.Background = new SolidColorBrush(backgroundColor);

            m_listbox.SelectionChanged += delegate(Object sender, SelectionChangedEventArgs e)
            {
                Int32 previousSelectedIndex = e.PreviousSelectedIndex;
                if (previousSelectedIndex != -1)
                {  // If there was a previous index
                    // Change previously-selected listbox item color to unselected color
                    ((Text)m_listbox.Items[previousSelectedIndex].Child).ForeColor = unselectedItemColor;
                }

                // Change newly-selected listbox item color to selected color
                ((Text)m_listbox.Items[e.SelectedIndex].Child).ForeColor = selectedItemColor;
            };
         

            //  Add the items to the listbox
            foreach (String s in new String[] { "Application Setting", "Upload Data", "Down Data", "Start Work" })
            {
                Text text = new Text(f,s);
                text.ForeColor = unselectedItemColor;
                text.TextAlignment = TextAlignment.Center;
          
                ListBoxItem lbi = new ListBoxItem();
                lbi.Background = m_listbox.Background;
                lbi.Child = text;
                m_listbox.Items.Add(lbi);
            }
            m_listbox.SelectedIndex = 0;

            // Add a blank line in the stack
            panel.Children.Add(textflow = new TextFlow());
            textflow.TextRuns.Add(" ", f, instructionTextColor);
            textflow.Visibility = Visibility.Visible;

            //// The bottom child contains text with return instructions
            textflow = new TextFlow();
            textflow.TextAlignment = TextAlignment.Center;
            textflow.Visibility = Visibility.Visible;
            textflow.TextRuns.Add(
               new TextRun("(After viewing a Panel Demo, hit Enter to return to this screen)",
               f, unselectedItemColor));
            panel.Children.Add(textflow);
        }

        protected override void OnButtonDown(ButtonEventArgs e)
        {
            // If <Enter> button is pressed, go into the selected demo

            if (e.Button == Button.Select)
            {
               switch (MainListBox.SelectedIndex) {
            case 0: 
               Debug.Print("你刚刚按下按键:"+ MainListBox.SelectedIndex.ToString());
               break;
            case 1:
                Debug.Print("你刚刚按下按键:" + MainListBox.SelectedIndex.ToString());
               break;
            case 2:
                Debug.Print("你刚刚按下按键:" + MainListBox.SelectedIndex.ToString());
               break;
            case 3:
                Debug.Print("你刚刚按下按键:" + MainListBox.SelectedIndex.ToString());
               break;
         }
            }
         
            // Don't call base implementation (base.OnButtonDown) or we'll go back Home
        }

        protected override void OnGotFocus(FocusChangedEventArgs e)
        {
            // Whenever this window gets focus, it gives it to its listbox
            Buttons.Focus(m_listbox);
            base.OnGotFocus(e);
        }
    }
}

posted @ 2008-01-15 16:40 snow wolf 阅读(36) | 评论 (1)编辑

硬件中部署应用程序

  如何用Visual Studio 部署
使用vs你可以轻松把你的应用程序部署到模拟器上或一个真实的设备上。要完成部署的过程,你首先要完成三个任务:
1,为了让你的VS知道你的解决方案中的哪个工程被部署,所以你要先选择要被部署的工程的选项。
2,设置要部署的工程为启动项。
3,在vs加上相应的设置,让VS知道你要把你的应用程序部署到哪里。


选择要部署的工程:

 第一步,在你要部署的工程选项上面保证要部署的选项框是可用的,具体步聚如下:
   1,打开你要部署的工程。
   2,在主菜单中,打开配置管理器。
   3,在工程的列表中,确保要部署的工程的选择框被选中。

你一次只能部署一个工程,如果你在你解决方案中选择了多个工程,那么最后一个工程将会覆盖前面所有的工程。
为了避免多个工程部署事件的发生,.net MF中的解决方案仅仅是第一个工程部署选择是选择的。

设为启动项:
  在你解决方案中必须有一个选项是启动项。启动项,中必须包函Main函数。在你部署你的应用程序之前,
你必须设置有Main函数的工程为启动项,具体步聚如下:
   1,在解决方案浏览器中,右键击你的工程,在右菜单中点击属性。
   2,在属性页中,点击Micro Framework。
      3,在传输下拉列表中,选择模拟器,串口,TcpIP,USB


 部署排错
如果你在部署你的应用程序时会出现一此错误如“部署失败”时,下面措施可以帮助你解决那此问题。

  确认物理连接:
  确保你的计算机与设备的物理连接的畅通性,并使用正确的端口调试你的应用程序。
    1,选择正确的线缆类型。
    2,在许多情况下,一台机器会有多个端口。所以你必须确保你的使用的端口正是你所需要的端口。
    3,如果你使用的TCP/IP连接,确保设备在正确的内网中,并通讯信息能够被正确的路由。

  选择工程的属性对话框:
   在工程菜单中,打开属性的对话框选择MicroFramework选项卡。确保连通性的相关设置正确。
如果你在使用TCP/IP,那么确保正确IP地址已经在设备框中设置好了。

  重启或重置设备:
如果你使用自动分配的TCP/IP,你必须检查最新被分配的IP地址.

    重启Visual studio
 关闭vs和相当的进程,并重新启动。

  使用MFDeploy工具Ping 你的设备:
运行MFDeploy,选择正确的端口,点击Ping按键去确定.net MF运行并通过正确的端口通讯。如果你使用COM端口,
错误提示会告诉你某个端口正在另一个进程使用。

 清除设备上的部署程序集和扇区:
运行MFDeploy,选择正确的端口,点击消除按键清除设备上程序文件。
 
 减少部署文件的大小:
 如果工程中有比较大的资源文件,尽量减少它的大小,因为它可能会超过你的设备的存储空间。

 确认你的.net MF的版本和你的设备是否兼容:
检查设备的固伯是否与这个版本的sdk相兼容。你可以下载新的闪存固件和新的.net MF sdk版本。

  


 

posted @ 2008-01-15 12:09 snow wolf 阅读(43) | 评论 (0)编辑

2008年1月14日 #

应用程序的调试

  .net MF在Visual Studio 中提供了丰富的调试能力。当你配置好你的应用程序后,你可以在Visual Studio中像调试
一般应用程序一样去调试你的程序。无论你是将你程序部署在模拟器上还是在一个真实的设备上,你都可以设置断点或逐步调试
你的应用程序。

  但是.net MF 不支持下面的一此调试特性:

   1,调试静态构造器
   2,可视化调试
   3,查看反编译的模块代码。
要注意的是.net MF中没有其它的托管的调试工具。

posted @ 2008-01-14 13:49 snow wolf 阅读(23) | 评论 (0)编辑

2008年1月13日 #

创建托管驱动

 我们今天来介绍一下,如何来使用.net MF来创建与各种硬件设备通讯的托管的驱动程序。

 托管驱动是通过标准的工业连接器与硬件通讯的类。 例如, 你可以创建托管驱动通过GPIO,i2c,让你的程序与硬件平台通讯。


   托管驱动的主要目标是通过连接进行信息的交换。
例如:一个通过GPIO连接的按键的驱动表示一个按键的状态,当我们点击这个键时,它会通知.net MF关于这个按键的事件,
你的应用程序也会得到这个按键的消息。
我们来看下面的例子:

public class Button : IDisposable
{
    protected InterruptPort m_interruptPort;

    //--//

    public Button( Cpu.Pin pin, GPIOInterruptEventHandler callback )       
    {
        m_interruptPort = new InterruptPort( pin, true, Port.ResistorMode.PullUp, Port.InterruptMode.InterruptEdgeLow );           

        if(callback != null)
        {
            m_interruptPort.OnInterrupt += callback;
        }
    }

    public Cpu.Pin Id
    {
        get
        {
            return m_interruptPort.Id;
        }
    }

    public void Dispose()
    {
        m_interruptPort.Dispose();
    }
}

这个类提供了一个为按键连接GPIO引脚的驱动。当应用程序调用按键的构造器时,它必须明确引脚的参数来确认是哪个引脚与这个按键通讯。
应用程序中也实现了回调函数中也实现了相应的参数。当按键按下时,.net mf自动调用回调函数。应用程序通过回调函数来反应按键按下的事件。


如上例所述,托管驱动必须管理输入与输出来实现设备与连接的通讯。

如果某设备通过I2C连接,那么你的驱动将从你的应用程序中接收命令。驱动将会解释这此命令,并把它们发送硬件的引脚并执行它们。如果这个解释的过程需要从引脚返回某此状态
那么驱动将会把这此返回信息发送到你的应用程序。

posted @ 2008-01-13 13:33 snow wolf 阅读(16) | 评论 (0)编辑

2008年1月11日 #

数据的加密与解密

在许多场景中我们的应用都需要保护我们的数据。例如,如果我们的设备要在一个不安全的连接传输我们的个人信息,那么
在数据传输前,我们应该先进行加密。

 .net mf 目前的程序集中支持两种加密算法。
第一种,加密算法是RSA 加密算法,它的实现逻辑放在Key_RSA类中。这个算法的是高安全性的,我们可以用它来实现数据签名等功能。
第二种,加密算法是扩展的XTEA.


  .net mf 加密的扩展能力

 如果你的应用程序需要 一种全新的.net mf中没有的加密算法时。你可以实现你自己的加密算法。

实现你自己的加密类,先要继承 Microsoft.SPOT.Cryptography 命名空间下的 Key类。然后,重写Key.Encrypt 和 Key.Decrypt 虚方法。





using System;
using Microsoft.SPOT;

namespace MFClassLib
{
    class Encrypt:Microsoft.SPOT.Cryptography.Key
    {
        public override byte[]  Decrypt(byte[] data, int offset, int count, byte[] IV)
        {

            //
            //
            //
          throw new Exception("The method or operation is not implemented.");
        }
     
    }
}

posted @ 2008-01-11 14:48 snow wolf 阅读(37) | 评论 (0)编辑

.net micro framework 之 时钟

  关于时钟


.net micro framework 提供了两种时钟, 系统时钟和慢时钟来控制应用程序的时间。

 系统时钟

 系统时钟的频率是由硬件平台的厂商来设定的
我们可以使用Cpu.SystemClock 属性来获得系统时钟的频率。


慢时钟
 慢时钟的频率也是由硬件的厂商来设定的。一般来讲,慢时钟是系统时钟频率的多少分之一。
 Cpu.SlowClock可以获得慢时钟。

posted @ 2008-01-11 14:27 snow wolf 阅读(21) | 评论 (0)编辑

     摘要: .net Micro Framework 创建 WPF  阅读全文
posted @ 2008-01-11 10:54 snow wolf 阅读(45) | 评论 (0)编辑

2008年1月7日 #

创建托管应用

      .net MF 给我们提供了一个可以快速创建嵌入式应用的基础结构。它包函.net Framework
和.net compact framework的部分编程模型.并使用了公共语言运行时,和一系列的类库.但它的类
库与CLR我们应谨慎在小型设备上使用.
 
      CLR
 
     CLR是托管代码在运行时的代理,它提供一些核心的服务例如,内存管理,线程管理,
Remoting。另外,类型安全也CLR一个比较重要的特性,它可以有效的改善我们应用程序的
安性与性能。 其实,代码管理仅仅是CLR的一个基本的概念。目标代码是CLR的我们称之
为托管代码,其它的目标代码不是CLR的则称之为非托管代码。
  托管环境解决了许多通用软件的问题。例如,运行时自动处理对象在堆上的排列并管理对
象的引用。当对象不再被使用时释放对象所占用的内存空间。因此内存自动管理(垃圾回收)
帮我们解决了通用的软件的错误-内存泄漏和访问冲突。
   
   类库
  .net MF给我人提供了一个可以重用的类库,依靠它我们可以轻松开发出入式应用程序。这些
类被集成在CLR中。

另外,我们可以通过这此类库,来访问我们设备的底层硬件,比方说,一般通用的硬件接口,GPIO
, I2C, SPI. 强大的类库,和标准的硬件访问接口大大缩短了应用程序开发周期。

   命名空间
   system命名空间是.net MF 基础命名空间的根. 此命名空间中包函着我们创建应用程序的所有
的数据类型:Object,Byte,Char, Arry, Int32, String,……
   另一个重要的命名空间是Microsoft.SPOT和Microsoft.SPOT.Hardware 它们提供.net MF对底层
硬件的支持。

posted @ 2008-01-07 17:27 snow wolf 阅读(28) | 评论 (0)编辑

     摘要: 1. 界面设计: WinCE系统一般分为两部分: Windows Mobile 和Windows CE 移动设备在界面设计时应当注意的问题。 输入法,由于移动设备的输入法不台式机不同,所以开发人员 在进行UI设计应当针对不同的输入法设计不同的应用界面。 例如:小键盘输入法,当系统启动小键盘输入法后,由于小键盘   由于设备键盘不好用,程序开发人员可以为用户制定部分功能的键盘。2. 程序设计a) R... 阅读全文
posted @ 2008-01-07 10:15 snow wolf 阅读(128) | 评论 (0)编辑

2008年1月6日 #

                                                                                                 .net MF体系结构


使用Visual Studio 20005 C# 我们可以开发嵌入式设备的应用程序,但有些方面是.net MF是限制的,
              例如:高级网络

          机器人

          电子乐器

          工业自动化设备

          和其它需要高实时性的设备。

 

.net mf复杂的体系结构可以满足众多新的硬件平台。

o_Micro.jpg 

硬件层:

  硬件层包括微型处理器和你所选择的电路。.net MF运行在可多种的硬件平台上。而且它也可以运行在windows 和微软合作伙伴的操作系统之上,
.net MF可以扩展所支持的芯片,如果你是硬件生产厂商并且你希望.net mf 支持你们的产品。你可以联系.net mf团队。

运行时组件层:

   运行时组件层包函三个组件:公共语言运行时,硬件抽像层,平台抽像层。

   公共语言运行时是.net framework  CLR的一个子集。但它却提供了丰富的应用支持,如 内存管理,多线程支持,代码分析,
和其它系统服务。

   HAL PAL

    它们控制系统的底层硬件。它们是由CLR调用的一组由C++编写的控制底层硬件的函数集。虽然PAL与硬件无关,但你也应该
为你的硬件平台写你自己的
HAL程序.

      引导程序是与HAL交互的附加代码,当你打开设备的电源时,引导程序将初始化底层的硬件,然后,启动CLR执行高级别的初始化。
引导程序是通过调用
HAL和运行时程序集来完成引导过程的。它并不与调用我们编写的软件的程序集。

类库层:

类库层包函原始的类库集,它可以帮助我们开发嵌入应用程序。它的C#类库支持加密,调试,图像,shell dll

 托管的C#应用程序可以访问扩展的芯片以支持特殊的通讯标准。例如:GPIO,串口,SPI, I2C

应用层:

   应用层属于.net MF结构的最高层它包函你创建的基于你的特定设备的托管程序。程序程序的类型依据你的设备。 
另外,
C#是目前托管程序支持的唯一的高级语言

posted @ 2008-01-06 16:49 snow wolf 阅读(110) | 评论 (0)编辑