【STM32 .Net MF开发板学习-26】借道调试口与开发板通信

简介:

  目前可以成为.NET MF开发板调试口的信道有,串口、USB和网口,一般情况下,一旦具体设定哪个信道,在不更换固件的情况下,是无法动态改变的。

    所谓调试口,就是供windows平台上的VS2008/VS2010调试的信道,当然MFDeploy和我编写的工具YFAccessFlash也是通过这个信道和开发板实现通信的。不过,这些通信过程,作为运行到开发板上的应用程序是无从知道的,这些基于开发板底层的通信,完全由TinyCLR进行全权管理。

    我以前写了一篇关于这个信道的通信协议的介绍文章《Micro Framework WireProtocol协议介绍》,文章中介绍,WireProtocol协议是上位机MFDeployVS2008程序在诊断、部署、调试.Net Micro Framework设备及相关应用程序时的通信协议。该协议与具体的硬件链路无关,目前支持的物理连接有串口、网口、USB等。该协议为点对点协议,协议中没有设备地址的概念,在同一时间同一物理通道仅能调试一台设备。协议格式分两部分,帧头和负荷(Payload)(一帧命令可以不包含Payload)。目前,通信命令一共71个,其中1个已经过时、6个已经被注销(V4.1版本又增加了几个命令)。

    有了以上知识,我们很自然地想到,借助这个通信协议,我们是否可以扩展一下,自定义我们所需要的通信命令,这样借助WireProtocol协议通道,我们就可以传输任意长度的数据了。

    不过,说起来容易,做起来难,这就像练武之人想打通任督二脉一样,打通的意义虽然重大,但是实现起来却环节众多。考虑到复杂性,所以我这里不打算详细介绍所有实现的细节,由点带面,简要说一下实现的过程,我们需要修改或创建的文件(或代码)如下:

    PC 平台:改造MFDeployEngine.dllMicrosoft.SPOT.Debugger.dll文件,创建UsbStream类。

    MF 平台:修改TinyCLR_Debugging.hDebugger.CPP文件,添加c_Monitor_Custom命令,此外再实现一个P/Invoke接口,让运行在开发板上的用户程序可以访问该通道。

    P/Invoke接口中的UsbStream类的定义(.NET Micro Framework代码)如下:

   public class UsbStream

    {

        public UsbStream();

        public int BytesToRead { get; }

        public int BytesToWrite { get; }

        public event UsbStreamDataReceivedEventHandler DataReceived;

        public void Close();

        public void DiscardInBuffer();

        public void DiscardOutBuffer();

        public bool Open();

        public int Read(byte[] buffer, int offset, int count);

        public int Write(byte[] buffer, int offset, int count);

    }

   和串口的定义类似,不过不用设置通信参数。

   运行在PC机上的UsbStream类的定义(.NET Framework代码)如下:

    public class UsbStream

    {

        public UsbStream(YFDeploy deploy);

        public int BytesToRead { get; }

        public int BytesToWrite { get; }

        public void Close();

        public void DiscardInBuffer();

        public void DiscardOutBuffer();

        public bool Open();

        public int Read(byte[] buffer, int offset, int count);

        public int Write(byte[] buffer, int offset, int count);

    }

    二者代码几乎相同,不过后者构造函数中有参数,并且没有事件函数。

    我们做一个Demo,来演示我们所实现的功能,很简单的做法,就是PC向开发板发送数据,开发板原样返回。

    PC机上的主要代码如下:

       private void btnSend_Click(object sender, EventArgs e)

        {

            if (txtOutput.Text.Length <= 0) return;

            if (usb == null)

            {

                usb = new UsbStream(deploy);

                if (!usb.Open())

                {

                    txtOutput.BackColor = Color.Red;

                    usb = null;

                    return;

                }

                else

                {

                    txtOutput.BackColor = Color.White;

                }

                trmRead.Enabled = true;

            }                                    

            byte[] inData = System.Text.ASCIIEncoding.UTF8.GetBytes(txtOutput.Text);

            if (usb.Write(inData, 0, inData.Length)>0)

            {

                txtOutput.BackColor = Color.White;

            }

            else

            {

                txtOutput.BackColor = Color.Red;

            }

        }

        private void trmRead_Tick(object sender, EventArgs e)

        {

            if (usb != null)

            {

                if (usb.BytesToRead > 0)

                {

                    byte[] bytData = new byte[usb.BytesToRead];

                    usb.Read(bytData, 0, bytData.Length);

                    txtInput.Text += new String(System.Text.ASCIIEncoding.UTF8.GetChars(bytData));

                }

            }

      }

     开发板上的代码如下:

       public static void Main()

        {

            UsbStream usb = new UsbStream();

            if (usb.Open())

            {

                Debug.Print("open ok");

                Graphics.Print("open ok\r\n");

            }

            usb.DataReceived += new UsbStreamDataReceivedEventHandler(usb_DataReceived);

            while (true)

            {

                Thread.Sleep(100);

            }

            //usb.Close();

        }

        static void usb_DataReceived(object sender, EventArgs e)

        {

            UsbStream usb = (UsbStream)sender;

            string strInfo = "[" + usb.BytesToRead.ToString()+"]";

            if (usb.BytesToRead > 0)

            {

                byte[] bytData=new byte[usb.BytesToRead];

                usb.Read(bytData,0,bytData.Length); 

                for (int i = 0; i < bytData.Length; i++)

                {

                    strInfo += bytData[i].ToString() + " ";

                }

                usb.Write(bytData, 0, bytData.Length);

                Graphics.Print(new string(System.Text.UTF8Encoding.UTF8.GetChars(bytData)));

            }

            Debug.Print(strInfo);              

        }

       代码都非常简单,这里就不过多介绍了,我们看一下效果图。

       

       PC机上的程序,类似串口调试工具,可以发送和接收数据。

       

       开发板的LCD屏上显示从PC接收的数据。

       

        调试串口输出的调试信息,可以看到开发板接收的字节数据。

    以上功能的实现还是非常有意义的,特别是我们做一个产品的时候,我们可以很方便的通过PC配置我们产品的参数,并且可以和该产品进行通信。这样就不需要通过其它的通信口,来完成该功能了。并且难能可贵的是,实现了私有通信,但是并没有牺牲掉调试口。

 

 本文源码:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/YFAccess.rar

MF快速参考: .NET Micro Framework 快速入门

MF中文讨论组:http://space.cnblogs.com/group/MFSoft/

【低价开发板】http://item.taobao.com/item.htm?id=7117999726






本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/475419,如需转载请自行联系原作者

相关文章
|
安全
.Net MF V4.0开源前的代码整理
已经有好长一段时间没有更新博客了,一是去美国总部和台湾出差用了不少时间,二是做.Net MF代码整理又花了近一个月的时间。不过令人欣慰的是,目前.Net MF V4.0的相关代码整理已经告一段落,就等着下一步的开源了
628 0
|
内存技术
【玩转.Net MF – 01】Flash远程读写
目前在PC远程访问设备Flash,也就是部署TinyCLR和下载应用程序
537 0
|
内存技术
【玩转.Net MF – 02】让PC成为MF的鼠标键盘
通过扩展我以前为.Net MF开发的WinForm库(参见我以前的文章《开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单》),增加一个输入代理层,就可以实现虚拟鼠标和键盘输入。
562 0
|
网络协议
【玩转.Net MF – 03】远程文件查看器
做过WinCE或Windows Mobile开发的人都知道,VS2008开发工具提供了些远程工具,诸如远程文件查看器、远程注册表编辑器、远程堆查看器和远程放大等等。受此启发,所以才有了MF的远程文件查看器。
604 0
【玩转.Net MF – 04】远程屏幕截图
实现远程屏幕截图的思路很简单,就是直接获取设备的显存数据,由PC再现画面。由于我们已经实现了Custom信道,所以我们在原有程序基础上,增添一个Custom_Command_Screenshots命令,就可以完成数据的获取。
473 0
|
芯片 物联网 内存技术
WG7310(WLAN+Bluetooth+FM)芯片在.Net MF中的应用
WG7310芯片是Ti推出的一款芯片,集成了WLAN、Bluetooth、FM等功能(最近又推出了四合一的芯片,把GPS功能也集成了进去),由于以前在.Net MF上的一些工作是基于Ti DM335开发板上的,所以开发.Net MF系统的WiFi功能就选用了WG7310芯片。
696 0
|
芯片
免费发放firmwave,打造史上最低价.Net MF开发板
很久以前就曾多方位思考限制.Net Micro Framework发展的原因是什么?在物联网和Cortex-M3大行其道的今天,应该有更大的发展空间才对,为什么现在还是关注者甚少?我想主要原因有三,一、源码代码是否开源;二、是否有低价开发板;三、TinyCLR是否够小。
737 0
【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
.Net Micro Framework官方图形库是WPF,由于目前ST Cortex-M3开发板RAM太小,最大才512K(常见是128K或256k),并且Cortex-M3的CPU主频也不太高,运行WPF图形框架显得过于重了,所以我这边推出了轻量级图形库TinyGUI
575 0
|
内存技术
【STM32 .Net MF开发板学习-04】TinyGUI位图显示
由于Cortex-M3开发板的RAM比较小,比如EM-STM3210E仅128K,所以显示位图是个比较棘手的事,如320*240 16位的位图大小就为150K,由于官方的WPF以一个BMP位图为本底进行绘图,所以RAM内存需求至少大于150K。
606 0
【STM32 .Net MF开发板学习-06】蜂鸣器和LED数码管显示
无论是蜂鸣器还是LED数码管显示,其实这二者对代码编写来说没有太大区别,都是GPIO的一个典型应用。红牛开发板有一个蜂鸣器,而EM-STM3210E有一个四位LED数码管,代码都相对简单,不值的为二者单独写一篇博文,所以二者合一以一篇文章来说明,不过两个示例代码是独立的。
625 0