四旋翼飞行器之OSD(基本完成)

     目前我这已经开始四轴操控平台程序的编写,今天把界面做好了,添加了手柄信号采集和视频传输的功能。程序中的  连接手柄按钮使能   设置网络按钮 ,设置网络按钮使能 启动通信,这里是为了防止误动作  如图:

还缺少 下位机传回信息显示这一部分,这个我的方案是用GDI绘图,在videoSourcePlay控件上叠加显示。最后做成这样的效果:

程序源码我这里就不上传了,结合这两篇文章《上位机获取Mjpeg视频流程序(C#.NET语言+AForge.NET控件)(待测试)》和《Joystick using C# (GUAN`LI) 之完成篇》和自学习能力完全能够把这个程序 写出来的。程序编写中我会随时与大家分享学习心得。

下面是至 8.17日的学习成果,把学习心得分享给大家 ,和程序中关键的代码。

一,测试方法:

下图是进行程序测试的截图:

这里测试的方法是:因为我目前还没写下位机程序,这里用另一台电脑当作控制信号的接收端。

1,打开服务端(即 信号接收端),这里我是用vs2008写的一个信号接收的小程序,进行四轴控制端程序的测试用的。

2,WIFI连接 服务端(即当作四轴的电脑)。

3,打开 四轴控制端程序。

测试的结果如图,校验正确,然后显示控制数据。(利用的Telnet远程登陆另一台电脑)。

下面我来给大家分享一下程序的核心内容 。然后把  信号接收端的程序开源分享给大家。

二,控制端程序的核心内容。

 先添加两个空间的引用,

using System.Net;
using System.Net.Sockets;

网络通信这块主要是用到了  TcpClient  和NetworkStream这两个类,

下面是连接下位机核心的代码:

 1    private void start_button_Click(object sender, EventArgs e)
 2         {
 3            //与下拉机连接
 4             try
 5             {
 6                 client.Connect(url_conrtol, Convert.ToInt32(portNumber));      // 与服务器连接
 7             }
 8             catch (Exception ex)
 9             {
10                 textBox6.Text = "连接异常,"+ex.Message;
11                 return;
12             }
13             //与下位机握手,否则返回异常。
14             streamToServer = client.GetStream();
15             const int BufferSize = 10;
16             buffer = Encoding.Unicode.GetBytes("hello");     // 获得缓存
17             try
18             {
19                 lock (streamToServer)                                                //它可以把一段代码定义为互斥段(critical section)
20                 {
21                     streamToServer.Write(buffer, 0, buffer.Length);      // 发往服务器
22                 }
23                 int bytesRead;
24                 buffer = new byte[BufferSize];
25                 lock (streamToServer)
26                 {
27                     bytesRead = streamToServer.Read(buffer, 0, BufferSize);  // 这是一个同步方法。
28                 }
29                 string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
30                 if (msg == "HELLO")
31                 {
32                     textBox6.Text = "四轴已连接!";
33                     flag_com = true;
34                 }
35                 else
36                     throw new Exception("未返回期望结果!");            //手动抛出异常
37             }
38             catch (Exception ex)
39             {
40                 textBox6.Text ="握手异常,"+ ex.Message;
41                 return;
42             }
43            
44             JPEGStream jpegSource = new JPEGStream(url_video);
45             OpenVideoSource(jpegSource);
46 
47         }

程序说明 :client是TcpClient  实例化的对象,streamToServer 是NetworkStream的对象。这段程序请求与下位机进行连接,首先发送一个“hello”字符串,若返回“HELLO”则表示握手成功,则可以把控制数据发送到下机。

当握手成功之后,便可以把数据发送到下位机,此时flag_com=true;。

整个程序的数据转化过程:   摇杆信号数据(int)->  char[] (高8位,低8位)-> string ->byte--------socket------------->下位机->byte->string->char[] (高8位,低8位)->int 。强调一下,这里int->char 只能低8位能数据才能得到正确的结果, string-> byte  必须是unicode编码,否则都不正确,这个是经过一天调试得出的结果。

为了数据的正确性,进行了CRC16的校验,下面是代码:

 1 private ushort CRC16( char[] array,int Len)
 2 {
 3    int CRC;
 4    UInt16 IX, IY;
 5    CRC = 0xffff; //set all 1
 6    for (IX = 0; IX < Len;IX++ )
 7    {
 8 
 9       CRC = CRC ^ (UInt16)(array[IX]);
10       for (IY = 0; IY <= 7;IY++ )
11       {
12            if ((CRC & 1) != 0)
13                CRC = (CRC >> 1) ^ 0xA001;
14            else
15                 CRC = CRC >> 1;
16        }
17 
18    }
19    return (ushort)CRC;
20 
21 }

我把服务端的源码分享给大家 ,利用大家开发和调试:ServerConsole.rar   ,服务端当接收一个“hello”时,会返回一个“HELLO”进行握手。具体使用代码里面有详细注释。

 至 2010.8.21

已经完成程序的大部分,如图:

程序到这里就差不多了,有时间后期整合,googlemap进行轨迹的记录.下面开始学习嵌入式,我的飞控采用的ARM9开发板。所以这个就我学习的重点。结合下位机回传的数据,再写上位机数据处理显示这一部分的程序。关于GDI+绘图的部分比较简单,这里就不做讲解,网上有N多的资料。

原文地址:https://www.cnblogs.com/dreamfactory/p/2630614.html