叶帆工作室

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

刘洪峰ID:yefanqiu
521663次访问,排名81好友0人,关注者169
微软MVP / CSDN 2008十大MVB/MSDN中文技术论坛版主
yefanqiu的文章
原创 216 篇
翻译 0 篇
转载 3 篇
评论 1089 篇
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
最近评论
mulingfeng:-------- SOS
我要想用 asp.net做一个类似这样的url重定向 如何做
eg:http://xxx.xx.com/feng
给这种访问方式做一个重定向 如何做 ?
mulingfeng:请问 我要想用 asp.net做一个类似这样的url重定向 如何做
eg:http://xxx.xx.com/feng
给这种访问方式做一个重定向 如何做 ?
jacle169:峰哥, micro Framework3.0 beta出了,我已经装到vs08里了,但是你的sdk不能注册到vs08里,你帮帮忙改个vs08 里能用的sdk吧,谢谢.
赵广涛:高手帮帮忙,VB画有两个Y轴的曲线图怎么画?
sfweb2008:老兄:
你真厉害!
你有VB Api函数功能及用法详解吗?我有好多这方面的问题不是很明白!还请指教,谢谢!

我的邮箱xsdjxx@tom.com
文章分类
收藏
    相册
    叶帆照片
    【叶帆软件】
    [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研究—Windows桌面收藏

    新一篇: .Net Micro Framework研究—模拟器直接运行MF程序 | 旧一篇: .Net Micro Framework研究—带I2C总线的模拟器

             今天是2007年最后一天,还有几个小时就迎来充满期待的2008年了。元旦放假至今不到48个小时的时间里,我至少有30多个小时坐在电脑前研究MF相关技术,在缺少必要的硬件的情况下,利用现有的资料,扩充了现有的模拟器功能。也希望像我这样的穷人们,借助模拟器,能体验一下以前只有拥有硬件才能调试的功能。
    以前为了介绍MF图形方面的功能,我做了一个“北京2008奥运场馆查询”程序,现在看来那个程序,已经不足以展示MF整体功能的强大。既然Windows 2000 /XP/vista,Windows CE(Windows Mobile)程序都有Windows桌面和开始菜单,那么我们的.Net Micro Framework也应该有一个。岂能光说不练,下面就是我们MF Windows的桌面和开始菜单。
    看了这个截图,也许有的网友会认为,这有什么难,这不是从windows mobile系统上做了一个截图嘛。实话实说,这样认为还真是想简单了,除了windows图标和小喇叭外,其它部分全部用代码实现,光字体就用了两种不同大小的字库,此外时钟也不仅仅做个样子,也是能正常刷新显示的。开始菜单我们也有,不仅能选择,还能执行对应的功能,不要急,下面我们一一说起。
     
    在上几篇blog上我说了,我做的模拟器又扩展了两个键(菜单键和返回键),别说,这个程序在微软的模拟器上运行起来还真有问题,因为它不支持菜单键,无法弹出菜单来。
    菜单上项目也不仅仅是摆设,和模拟器新增的功能结合在一起,做了一个功能测试大荟萃。让我们先看看GPIO测试的功能在“windows桌面”是怎样的?
    菜单上选中“GPIO测试”项,按一下键盘上的回车或者单击模拟器上的“OK”键,就进入上图界面。单击模拟右下角的“>>>”项,展开模拟器上的GPIO测试面板。
    单击模拟上的I输入开关,桌面上显示的输入信息也同步发生了变化,Q输出是有用户程序控制的,灯会一一亮起或关灭,桌面上的显示也和模拟器像对应(插一句,千万不要以为上面模拟器和模拟LCD中的程序为同一个,两者彼此独立,用户程序通过正常的指令和模拟器交互(当然同样的代码对实际硬件也一样))。
    下面我们再看看“AD测试”功能。
    通过开始菜单,我们进入“AD测试”模块,相应的,我们单击“<<<”旁边的“GPIO”字符,弹出选择菜单,我们单击“AD”,模拟器呈现AD模拟数据操作面板。
    移动滑块,我们发现桌面中的数据同步发生了改变,不好意思,模拟出部分被弹出菜单给挡住了,我们再来一张截图。
    QW0是由用户程序控制的,看的出来,模拟器忠实的获取了该数据并显示了出来。说到这里我还得多说几句,其实模拟器的部分程序更像运行在实际硬件系统中的IO驱动程序,spi读写指令操作的是字节数组,所以上传的数据是否浮点型、是否整形等等,全都需要约定,这也决定了不同的厂家对同样的物理信号进行采集,传到MF系统中的数据有可能不同,不过通过特定的换算,最终的结果一定是差不多的。
    下面说一下I2C总线,I2C我的理解和串口通信、CAN口通信差不多,都是两个相对独立的设备进行数据交互,I2C和CAN通信一样,需要设置设备地址,此外还需设置一下时钟主频。下图是测试程序界面。
    前三个数据是用户程序进行修改的,由于有时间差,二者数据刷新时刻不同,所以不一致,后五个数据是模拟输入的,可以看出桌面上的显示已经可以同步更新了。用这种方式模拟I2C,我也觉得有些不妥,以后有更好的方案我再修改。
    细心的用户一定会发现MF“Windows 桌面”右上角的时间在不断的变化,第一幅图是2007年12月31日21:39:23,最后一幅图的时间是22:27:33,也就是说,写这篇文章大概花了我50分钟,这是我在word写这篇文章的用时,接着再花一些时间写到我blog上,我想所有的一切完毕后,我想大概就可以聆听2008年的第一声钟声了。
    祝大家新年快乐!!!
     
    附:部分核心代码
    public override void OnRender(DrawingContext dc)
    {
        //绘制背景              
        dc.DrawRectangle(new SolidColorBrush(ColorUtility.ColorFromRGB(41,113,189)),null , 0, 0, Width, Height);
       
        //菜单条
        LinearGradientBrush lgb = new LinearGradientBrush(ColorUtility.ColorFromRGB(51,160,241), ColorUtility.ColorFromRGB(16,75,161), 0, 0, Width, 0);
        dc.DrawRectangle(lgb, null, 0, 0, Width, 26);
     
        //开始菜单
        dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.Win), 0, 0);
     
        //分割线
        dc.DrawLine(new Pen(Color.White), 26, 0, 26, 25); 
     
        //显示“开始”
        dc.DrawText("开始", YFFont, Color.White, 29, 7);
     
        //显示小喇叭
        dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.Sound), 320 - 75, 6);
     
        //状态区
        dc.DrawRectangle(new SolidColorBrush(ColorUtility.ColorFromRGB(189, 235, 255)), new Pen(Color.Black), 0, Height-26, Width, 26);
     
        //标识
        dc.DrawText("叶帆工作室荣誉出品", YFFont, Colors.Gray, 200, 220);
     
        switch (txtState.TextContent)
        {
            case "GPIO测试":
                string strPace = "   ";
                dc.DrawText("输入: I0 I1 I2 I3 I4 I5 I6 I7", YFFont, Colors.Black , 40, 50);
                dc.DrawText((input[0].Read() ? "1" : "0") + strPace + (input[1].Read() ? "1" : "0") + strPace + (input[2].Read() ? "1" : "0") + strPace + (input[3].Read() ? "1" : "0") + strPace + (input[4].Read() ? "1" : "0") + strPace + (input[5].Read() ? "1" : "0") + strPace + (input[6].Read() ? "1" : "0") + strPace + (input[7].Read() ? "1" : "0"), YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 78, 75);
     
                dc.DrawText("输出: Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7", YFFont, Colors.Black, 40, 100);
                dc.DrawText((output[0].Read() ? "1" : "0") + strPace + (output[1].Read() ? "1" : "0") + strPace + (output[2].Read() ? "1" : "0") + strPace + (output[3].Read() ? "1" : "0") + strPace + (output[4].Read() ? "1" : "0") + strPace + (output[5].Read() ? "1" : "0") + strPace + (output[6].Read() ? "1" : "0") + strPace + (output[7].Read() ? "1" : "0"), YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 78, 125);
                break;
            case "AD测试":
                dc.DrawText("AD: AW0=" + ReadWriteAD((Int16)QAW).ToString() + "   QW0=" + QAW.ToString(), YFFont, Colors.White, 60, 100);
                break;
            case "I2C测试":
                //I2C读写
                byte[] bytRData = new byte[8];
                byte[] bytWData = new byte[3];
                bytWData[0] = (byte)IntI2CNum;
                bytWData[1] = (byte)(IntI2CNum * 2);
                bytWData[2] = (byte)(IntI2CNum * 3);
                I2CDevice.I2CTransaction[] i2c = new I2CDevice.I2CTransaction[2];
                i2c[0] = I2CBus.CreateReadTransaction(bytRData);
                i2c[1] = I2CBus.CreateWriteTransaction(bytWData);
                I2CBus.Execute(i2c, 100);   //执行
     
                string strPace1 = " ";
                dc.DrawText("I2C(字节0-7):", YFFont, Colors.Black, 50, 80);
                string strInfo = bytRData[0].ToString() + strPace1 + bytRData[1].ToString() + strPace1 + bytRData[2].ToString() + strPace1 + bytRData[3].ToString() + strPace1 + bytRData[4].ToString() + strPace1 + bytRData[5].ToString() + strPace1 + bytRData[6].ToString() + strPace1 + bytRData[7].ToString();
                dc.DrawText(strInfo, YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 50, 105);
                break;
            default:
                //.Net Micro Framework
                dc.DrawRectangle(new SolidColorBrush(Color.White), new Pen(Color.White), 55, 90, Width - 110, 50);
                dc.DrawText(".Net Micro Framework", Resources.GetFont(Resources.FontResources.MF), Colors.Black, 60, 105);
                break;
        }
     
        //菜单显示
        if (bShowMenu)
        {
            menu.DrawMenu(dc);
         }
     }
     
    //按键信息
    protected override void OnButtonDown(ButtonEventArgs e)
    {
        switch (e.Button)
        {
            //按下确定键
            case Button.Select:
                if (bShowMenu)
                {
                    txtState.TextContent = menu.Text;
                    bShowMenu = false;
                    this.UpdateLayout();
                }
                break;
            //按下左键
            case Button.Left:
                break;
            //按下右键
            case Button.Right:
                break;
            //按向上
            case Button.Up:
                if (bShowMenu)
                {
                    menu.SelectIndex--;
                    this.UpdateLayout();
                }
                break;
            //按向下
            case Button.Down:
                if (bShowMenu)
                {
                    menu.SelectIndex++;
                    this.UpdateLayout();
                }
                break;
            //按下菜单
            case Button.Menu:
                bShowMenu = !bShowMenu;
                if (bShowMenu) menu.SelectIndex = 0;
                this.UpdateLayout();
                break;
            //按下返回键
            case Button.Back:
                txtState.TextContent = "就绪";
                break;
        }
    }

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

    附记:本来打算这篇文章作为2007年底最后一篇文章,没有想到从22点半到零点,竟然无法上传成功,只好作为2008年第一篇文章了,这也不错。

    发表于 @ 2008年01月01日 08:56:00|评论(loading...)|编辑

    新一篇: .Net Micro Framework研究—模拟器直接运行MF程序 | 旧一篇: .Net Micro Framework研究—带I2C总线的模拟器

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 叶帆