【STM32 .Net MF开发板学习-26】借道调试口与开发板通信-阿里云开发者社区

开发者社区> KB小秘书> 正文

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

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

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

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

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

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

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

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

MF 平台:修改TinyCLR_Debugging.h和Debugger.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);               

        }

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

      

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

      

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

      

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

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

 

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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《STM32库开发实战指南:基于STM32F4》----3.2 STM32能做什么
本节书摘来自华章出版社《STM32库开发实战指南:基于STM32F4》一书中的第3章,第3.2节,作者刘火良,杨森编著,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.2 STM32能做什么 STM32属于一个微控制器,自带了各种常用通信接口,比如USART、I2C、SPI等,可连接非常多的传感器,可以控制很多的设备。
2699 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6929 0
《STM32库开发实战指南:基于STM32F4》----2.5 下载程序
本节书摘来自华章出版社《STM32库开发实战指南:基于STM32F4》一书中的第2章,第2.5节,作者刘火良,杨森编著,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.5 下载程序 如果前面步骤都成功了,接下来就可以把编译好的程序下载到开发板上运行。
1502 0
【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取
目前M3的开发板,虽然前段时间可以支持WPF了,但是SRAM毕竟还是有限,所以从串口摄像头直接获取的jpg图像,并不能在LCD屏上显示出来(在模拟器上没有这个问题,可以直接呈现),所以我借助蓝牙接口,把另一个串口获取的图像数据发送到一台带蓝牙的PC上,PC上的程序否则实现数据接收,并把图像呈现出来。
505 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7765 0
独家 | ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)
本文探讨了简单的ARIMA/Sarima与LSTM的时间序列数据集成学习方面的问题。
1536 0
《ASP.NET 开发从入门到精通》----1.2 Web技术简介
学习Web开发,不得不提到本地计算机和远程服务器的概念。顾名思义,本地计算机是指用户正在使用的、浏览站点页面的机器。对于本地计算机来说,最重要的构成模块是Web浏览器。
1289 0
3-51单片机ESP8266学习-AT指令(开发板8266底层源码介绍)
上一篇链接  http://www.cnblogs.com/yangfengwu/p/8743502.html 直接上源码:注意源码有两部分,第一部分是一开始的时候写在模块内部的,另一部分是存在手机内部的,方便后期更新功能 看第一部分的源码 亲们可以直接把下面的第一部分(注意只下载第一部分就行)的程...
2195 0
+关注
1090
文章
1253
问答
来源圈子
更多
阿里云最有价值专家,简称 MVP(Most Valuable Professional),是专注于帮助他人充分了解和使用阿里云技术的意见领袖阿里云 MVP 奖项为我们提供了这样一个机会,向杰出的意见领袖表示感谢,更希望通过 MVP 将开发者的声音反映到我们的技术路线图上。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载