小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 173966|回复: 101

【机器人创意工作室教程八】WIFI/蓝牙智能小车机器人操控平台双向数据引擎与功能拓展

  [复制链接]
发表于 2012-11-19 23:38:07 | 显示全部楼层 |阅读模式
本期教程分为两部分,第一部分为新的双向数据引擎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();该函数的原型为:
  1. private void InitDataCallBack()
  2. {

  3. RobotEngine2.Setcallbackvalue += new WifiRobotCMDEngineV2.SetCallBackDataValue(DataCallBack);//注册数据回调函数
  4. }
复制代码
接下来,需要对注册的回调函数DataCallBack();进行具体的数据处理,回调函数的概念可以百度一下,相当于对函数地址的调用,这个用法非常经典,注册了回调函数之后,在引擎接收到来自下位机的数据包后,将自动调用到所注册的回调函数中,从而及时将数据传递给主进程。
DataCallBack()回调函数的实现如下:

  1. void DataCallBack(byte[] CallbackDataValue)
  2. {

  3. /*数据回传回调函数
  4. * 当有数据从下位机到达上位机后,将执行到此函数
  5. * CallbackDataValue[0]为类型位
  6. * CallbackDataValue[1]为命令位
  7. * CallbackDataValue[2]为数据位
  8. * 包头包尾已经去掉
  9. *
  10. * 协议说明
  11. * 0x03 雷达
  12. * 0x89 拍照
  13. * 0x60 电量
  14. * 0x61 湿度
  15. * 0x62 辐射
  16. * 0x63 温度
  17. *
  18. * 数据位不允许超过10,步长1
  19. *
  20. */

  21. foreach (byte b in CallbackDataValue)
  22. {
  23. builder.Append(b.ToString("X2") + " ");

  24. }
  25. DelegateUI(builder.ToString());
  26. builder.Clear();


  27. /////雷达数据开始
  28. if (CallbackDataValue[0] == 0x03)
  29. {
  30. this.Invoke((EventHandler)(delegate
  31. {

  32. try
  33. {

  34. if (Int32.Parse(CallbackDataValue[1].ToString()) == 0)//雷达数据:角度值
  35. {
  36. x_data = 0;
  37. }
  38. else
  39. {
  40. x_data = Int32.Parse(CallbackDataValue[1].ToString());
  41. }

  42. if (Int32.Parse(CallbackDataValue[2].ToString()) == 0)//雷达数据:距离值
  43. {
  44. y_data = 0;
  45. }
  46. else
  47. {
  48. y_data = Int32.Parse(CallbackDataValue[2].ToString());
  49. }

  50. RobotEngine2.WR_DEBUG("RADER", "x_data is:" + x_data.ToString() + ";++y_data is :" + y_data.ToString());

  51. }
  52. catch
  53. {
  54. x_data = 0;
  55. y_data = 0;
  56. }
  57. if (RadarStatus)
  58. {
  59. GetTarget(x_data, y_data);
  60. }

  61. }));
  62. }
  63. ////////雷达数据结束

  64. ///////自定义数据开始
  65. else if (CallbackDataValue[0] == 0x99)
  66. {
  67. //标志位为0x99
  68. //CallbackDataValue[1]即为数据内容。
  69. //请自行拓展
  70. }

  71. else
  72. {

  73. RobotEngine2.WR_DEBUG("DATACALLBACK", "+++++++DATACALLBACK NOTHING+++++++++");
  74. }

  75. }
复制代码
上面就是回调函数了,只要注册了回调函数之后,引擎收到了数据,就会调用到这个函数里面来,所以称之为“回调函数”是再适合不过的。
此函数中的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这个雷达数据给上位机,那么下位机那边只需要这样写:
  1. UART_send_byte(0xFF);
  2. UART_send_byte(0x03);
  3. UART_send_byte(0x45);
  4. UART_send_byte(0x60);
  5. 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的“运行”按钮,就可以跑起来了,如下图:
run.png
少数情况下,可能会报找不到dll文件之类的错误,那么需要添加一下引用,点击“项目”-》“添加引用”-“浏览”,找到我们的CommandEngine.dll引擎,选中点击确认即可。
2.png
整个工程能跑起来了,就可以对源代码进行一些改动,增加自己需要的功能了,工作室对复杂的代码都进行了封装,留出简单的接口方便大家调用,大家只需要有一点点C#的基础知识,就可以参考已有的代码,拓展功能。

下面举个例子,假设现在需要在源工程上添加一个按钮,按钮按下后,发送一个数据,让下位机的5号舵机转动90°。那么这个需求如何实现呢?
第一步,从VS2010的工具栏中拖一个按钮到界面上,如下图
button.png

第二步,双击这个按钮,VS2010将自动生成此按钮的单击事件button2_Click(),在此事件中加入发送代码,发送的代码可以参考其他按钮的事件,因为引擎是同一个,所以基本上直接COPY粘贴就行了。
我们就仿照其他按钮,在button2_Click()这个事件中加入让舵机5旋转90度的代码:
  1. RobotEngine2.SendCMD(controlType, RobotEngine2.CreateData(0x01, 0x05, 0x5A), comm);//舵机5旋转90度
复制代码
如下图:
3.png

其中,CreateData()这个函数为构建数据包函数,第一个参数为此数据包的类型位,由于舵机类型是0x01,所以这里填01,第二个参数是命令位,但是我们用作舵机的标号,所以要让5号舵机旋转,我们就填入0x05,最后一个参数就是旋转角度了,90度的16进制值为0X5A,因此我们这里填入5A,这样,当单击了这个按钮后,程序将自动调用这段代码将构造出来的    FF 01 05 5A FF数据包发送到WIFI板,再由WIFI板转发给驱动板,下位机程序就自动解析数据包,并让5号舵机旋转90度,完成整个指令的执行。
是不是很简单呢?多参考一下现有的源工程代码,可以拓展出很多自己需要的功能的。



评分

参与人数 3金钱 +7 收起 理由
timyou + 1 高手啊!
hfzaxy020618 + 3 很给力!
路易斯小胖 + 3 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-11-20 00:03:09 | 显示全部楼层
沙发 顶起来
回复 支持 反对

使用道具 举报

发表于 2012-11-20 00:20:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-11-20 00:25:51 | 显示全部楼层
第五行  没有debug吧 在bin下

评分

参与人数 1金钱 +3 收起 理由
liuviking + 3

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-20 00:30:05 | 显示全部楼层
赤龙之吼 发表于 2012-11-20 00:25
第五行  没有debug吧 在bin下

失误了,已修正,给你加分!
回复 支持 反对

使用道具 举报

发表于 2012-11-20 00:39:50 | 显示全部楼层
liuviking 发表于 2012-11-20 00:30
失误了,已修正,给你加分!

下位机的例子什么时候公布
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-20 00:49:54 | 显示全部楼层
赤龙之吼 发表于 2012-11-20 00:39
下位机的例子什么时候公布

老早就公布了,【机器人创意工作室教程七】WIFI智能小车机器人驱动板源代码合成与编写 http://www.wifi-robots.com/thread-2401-1-1.html
回复 支持 反对

使用道具 举报

发表于 2012-11-20 00:55:42 | 显示全部楼层
liuviking 发表于 2012-11-20 00:49
老早就公布了,【机器人创意工作室教程七】WIFI智能小车机器人驱动板源代码合成与编写 http://www.wifi-r ...

不是还加了额外传感器么
回复 支持 反对

使用道具 举报

发表于 2012-11-20 06:17:26 | 显示全部楼层
:):):):):)
回复 支持 反对

使用道具 举报

发表于 2012-11-20 09:08:39 | 显示全部楼层
那个CommandEngine.dll的源代码没有公开吗,老大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-23 09:27 , Processed in 1.102090 second(s), 25 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表