• 四旋翼飞行器之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多的资料。

  • 相关阅读:
    c#冒泡排序
    C# 虚方法(virtual)覆盖(override) 隐藏(new) 重载
    Javascript 大括号
    C# const.static.readonly.
    热点链接(img map area)
    WeiBo返回错误码的二种方式
    Cookie跨域操作
    synchronized(this)与synchronized(class)
    线程安全场景备忘
    git新建一个分支setupstream
  • 原文地址:https://www.cnblogs.com/dreamfactory/p/2630614.html
Copyright © 2020-2023  润新知