目前我这已经开始四轴操控平台程序的编写,今天把界面做好了,添加了手柄信号采集和视频传输的功能。程序中的 连接手柄按钮使能 设置网络按钮 ,设置网络按钮使能 启动通信,这里是为了防止误动作 如图:
还缺少 下位机传回信息显示这一部分,这个我的方案是用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多的资料。