|
本期教程分为两部分,第一部分为新的双向数据引擎V2R03的使用。第二部分应一些车友的要求,特此介绍一下如何在工作室发布的WIFI/蓝牙智能小车机器人操控平台上位机源码基础上,拓展出自己需要的指令功能。
首先说一下WIFI机器人网·机器人创意工作室上位机的源码工程下载地址: WIFI/蓝牙智能小车机器人操控平台源工程文件
WIFI/蓝牙智能小车机器人操控平台源码API调用说明
先下载这个工程文件,解压后得到一个文件目录,同时下载该帖中的CommandEngineV2R03.rar压缩包,解压得到MainForm.cs和CommandEngine.dll文件,将MainForm.cs文件拷贝到WIFI-Robot_Code_www.wifi-robots.com\WIFI-Robot_Release\WIFIRobots\目录下,将CommandEngine.dll文件拷贝到WIFI-Robot_Code_www.wifi-robots.com\WIFI-Robot_Release\WIFIRobots\bin\Debug目录下,覆盖同名文件,这样V2R03双向数据引擎就升级成功了。
在此重点介绍一下新的引擎所增加的特性和调用方法。
新引擎的特性为:
1、数据回传采用事件驱动,精确度大幅度提升,确保与下位机进行大数据量交换时,数据的稳定与准确。
2、新增域名、IP转换接口Domain2ip(string str);该接口用于动态域名转化为IP。
3、新增调试打印接口WR_DEBUG(string Moudules, string debugstring);该接口用于在程序中加入打印,方便查看各个变量值的实时变化情况
其他接口大家一般用不着,就不再细述了。
下面逐一进行介绍:(以下代码请参考MainForm.cs文件)
1、数据回传
之前版本的引擎在数据回传这一块精度不高,有时候有丢包现象,导致数据回传时实时性不够,或者接受不到数据,新的引擎改进了数据接收算法,使用事件驱动机制,保证一旦接收到数据,引擎立刻进行处理,将处理后的数据及时发送给用户进行处理。
使用新引擎的数据回传,需要在主程序的初始化函数MainForm_Load()中,注册数据回传的回调函数 InitDataCallBack();该函数的原型为:
- private void InitDataCallBack()
- {
- RobotEngine2.Setcallbackvalue += new WifiRobotCMDEngineV2.SetCallBackDataValue(DataCallBack);//注册数据回调函数
- }
复制代码 接下来,需要对注册的回调函数DataCallBack();进行具体的数据处理,回调函数的概念可以百度一下,相当于对函数地址的调用,这个用法非常经典,注册了回调函数之后,在引擎接收到来自下位机的数据包后,将自动调用到所注册的回调函数中,从而及时将数据传递给主进程。
DataCallBack()回调函数的实现如下:
- void DataCallBack(byte[] CallbackDataValue)
- {
- /*数据回传回调函数
- * 当有数据从下位机到达上位机后,将执行到此函数
- * CallbackDataValue[0]为类型位
- * CallbackDataValue[1]为命令位
- * CallbackDataValue[2]为数据位
- * 包头包尾已经去掉
- *
- * 协议说明
- * 0x03 雷达
- * 0x89 拍照
- * 0x60 电量
- * 0x61 湿度
- * 0x62 辐射
- * 0x63 温度
- *
- * 数据位不允许超过10,步长1
- *
- */
- foreach (byte b in CallbackDataValue)
- {
- builder.Append(b.ToString("X2") + " ");
- }
- DelegateUI(builder.ToString());
- builder.Clear();
- /////雷达数据开始
- if (CallbackDataValue[0] == 0x03)
- {
- this.Invoke((EventHandler)(delegate
- {
- try
- {
- if (Int32.Parse(CallbackDataValue[1].ToString()) == 0)//雷达数据:角度值
- {
- x_data = 0;
- }
- else
- {
- x_data = Int32.Parse(CallbackDataValue[1].ToString());
- }
- if (Int32.Parse(CallbackDataValue[2].ToString()) == 0)//雷达数据:距离值
- {
- y_data = 0;
- }
- else
- {
- y_data = Int32.Parse(CallbackDataValue[2].ToString());
- }
- RobotEngine2.WR_DEBUG("RADER", "x_data is:" + x_data.ToString() + ";++y_data is :" + y_data.ToString());
- }
- catch
- {
- x_data = 0;
- y_data = 0;
- }
- if (RadarStatus)
- {
- GetTarget(x_data, y_data);
- }
- }));
- }
- ////////雷达数据结束
- ///////自定义数据开始
- else if (CallbackDataValue[0] == 0x99)
- {
- //标志位为0x99
- //CallbackDataValue[1]即为数据内容。
- //请自行拓展
- }
- else
- {
- RobotEngine2.WR_DEBUG("DATACALLBACK", "+++++++DATACALLBACK NOTHING+++++++++");
- }
- }
复制代码 上面就是回调函数了,只要注册了回调函数之后,引擎收到了数据,就会调用到这个函数里面来,所以称之为“回调函数”是再适合不过的。
此函数中的CallbackDataValue数组就是来自引擎的下位机数据,CallbackDataValue这个数组的第0位为类型位,第1位为命令位,第2位为数据位,包头包尾已经被引擎过滤了,因为我们用不着~
FF (实际不存在)
CallbackDataValue[0] 类型位
CallbackDataValue[1] 命令位 看看左边的图示,就可以明白了,其实和我们上位机发下去的协议是一模一样的。
CallbackDataValue[2] 数据位
FF (实际不存在)
上面的函数第一部分是雷达数据,由于我们规定雷达数据的类型位为0x03,所以可以看到,程序首先判断类型位CallbackDataValue[0] 是不是0x03,是的话继续进行接下去的解析,由于雷达数据的特殊性(有角度有距离),所以我们把命令位也当成了数据位来使用了,这里的命令位作为角度值,数据位作为距离值,并将这两组数据输出到雷达屏幕,就形成了雷达上面的亮点了。
接下去一个是个示例,当类型位为0x99的时候,执行大家自定义的动作,当然后面可以无限的拓展,看个人发挥了。
目前要注意,数据回传必须符合特定的协议 FF 类型位 命令位 数据位 FF,不然会导致回调线程异常,这样就无法继续回传数据了。下位机那边发送数据函数调用很简单,比如说需要发送FF 03 45 60 FF这个雷达数据给上位机,那么下位机那边只需要这样写:- UART_send_byte(0xFF);
- UART_send_byte(0x03);
- UART_send_byte(0x45);
- UART_send_byte(0x60);
- UART_send_byte(0xFF);
复制代码 2、域名转换接口string Domain2ip(string str);
参数:字符串类型域名/IP
返回值:字符串类型IP
该接口可以自动判断填入的参数是域名还是IP,如果是域名,则自动将其转换为对应的IP,这点在外网控制上非常重要,免去了每次开启家庭路由后都需要重新设置IP的烦恼,只需要填入动态域名即可。如果是IP,则直接交给引擎进行连接处理。
3、调试信息打印接口 void WR_DEBUG(string Modules,string debugstring);
参数1:字符串类型模块名
参数2:字符串类型调试信息
返回值:空
该接口用于打印特定的调试信息,可以在代码中任何地方加入该函数和需要打印的变量,执行到此函数后,可以在VS2010的“输出”窗口看到调试信息与打印,模块名是可以自己随便定义的。
例如:设aa变量值为12345,现在想打印aa变量的值,可以在某段代码处加入WR_DEBUG(”MAIN“,aa);执行后可以看到“输出”窗口的结果为:
[WIFI-ROBOTS]++MAIN++++++++++++++liuviking DEBUG+++++++++++++++++ 12345
新引擎还有新增许多特性,由于用户一般不需要调用,故不再多做介绍。下面介绍一下怎么在上位机源工程上拓展自己的功能。
============================简单介绍如何拓展上位机功能====================================
上位机使用C#.net语言编写,IDE为Visual Studio 2010,大家可以自行百度下载,也很好破解的。下载完成后安装,安装时C#语言必须选上,其他C++,VB,J++可以按个人爱好添加。
安装完毕之后,到下载的上位机源工程目录,可以看到WIFI-Robot.sln文件,该文件就是上位机的源工程文件,直接双击它,就可以打开整个工程。
打开工程后,直接点击VS2010的“运行”按钮,就可以跑起来了,如下图:
少数情况下,可能会报找不到dll文件之类的错误,那么需要添加一下引用,点击“项目”-》“添加引用”-“浏览”,找到我们的CommandEngine.dll引擎,选中点击确认即可。
整个工程能跑起来了,就可以对源代码进行一些改动,增加自己需要的功能了,工作室对复杂的代码都进行了封装,留出简单的接口方便大家调用,大家只需要有一点点C#的基础知识,就可以参考已有的代码,拓展功能。
下面举个例子,假设现在需要在源工程上添加一个按钮,按钮按下后,发送一个数据,让下位机的5号舵机转动90°。那么这个需求如何实现呢?
第一步,从VS2010的工具栏中拖一个按钮到界面上,如下图
第二步,双击这个按钮,VS2010将自动生成此按钮的单击事件button2_Click(),在此事件中加入发送代码,发送的代码可以参考其他按钮的事件,因为引擎是同一个,所以基本上直接COPY粘贴就行了。
我们就仿照其他按钮,在button2_Click()这个事件中加入让舵机5旋转90度的代码:- RobotEngine2.SendCMD(controlType, RobotEngine2.CreateData(0x01, 0x05, 0x5A), comm);//舵机5旋转90度
复制代码 如下图:
其中,CreateData()这个函数为构建数据包函数,第一个参数为此数据包的类型位,由于舵机类型是0x01,所以这里填01,第二个参数是命令位,但是我们用作舵机的标号,所以要让5号舵机旋转,我们就填入0x05,最后一个参数就是旋转角度了,90度的16进制值为0X5A,因此我们这里填入5A,这样,当单击了这个按钮后,程序将自动调用这段代码将构造出来的 FF 01 05 5A FF数据包发送到WIFI板,再由WIFI板转发给驱动板,下位机程序就自动解析数据包,并让5号舵机旋转90度,完成整个指令的执行。
是不是很简单呢?多参考一下现有的源工程代码,可以拓展出很多自己需要的功能的。
|
评分
-
查看全部评分
|