目录
1、设备链表 没添加一个载具/飞机,就在链表里面添加一个实例化了的类(飞机/载具对象)
2、Device类包含了串口和TCP通讯的方法,添加一个新的载具飞机,只需要实例化这个类即可。Device类解析: Device这个类里面包含了所有通讯连接,数据读取的方法。
一 、硬件框架
本模式采用大功率WiFi数传配合大功率AP构成,覆盖距离比较远的局域网。
大功率WiFi和大功率AP的覆盖范围可以达到600M,如果考虑更远的距离可以考虑,加中继。局域网支持双向通信,我们认为是天然的组网环境,技术也相对比较成熟。这种方式也是支持,飞机与飞机的通讯的。
二、使用方式
设备列表理论上在目前的构架里面支持255架飞机,这里测试只是列出了5架。
目前的通讯方式支持COM的串口通讯,还有TCP/IP通讯,如果用UDP通讯也是可以的。采用TCP通讯方式,地面站和每一架飞机可以通讯,飞机与同一局域网的飞机也可以通讯的,这种构架可以做到理论上的多机协同。
三、软件框架
采用一个飞机/车辆实例化一个对象的方式。如果有多架飞机加入,那么就在实例化一个设备对象即可。同时维护一个设备对象链表,这样一来就可以一个地面站连接多架飞机/车辆。
1、设备链表 没添加一个载具/飞机,就在链表里面添加一个实例化了的类(飞机/载具对象)
SortedList<int, Device> SorlistDevice = new SortedList<int, Device>();
2、Device类包含了串口和TCP通讯的方法,添加一个新的载具飞机,只需要实例化这个类即可。Device类解析: Device这个类里面包含了所有通讯连接,数据读取的方法。
上图是Device里面所有的成员。
- comPort是实例化Mavlink库里面的类,实现了所有和mavlink相关的操作,指令发送,命令解析等等。通过这个类,我们实现对飞机的控制,指令发送。
- serialreaderthread = new Thread(SerialReader) 是创建了一个数据读线程,这个线程用于读取控制板的数据也就是每一架载具都对应一个数据读线程。如果有100架飞机,那么对应这100个数据读取线程。这100个线程通过Device对象链表来管理( SortedList SorlistDevice = new SortedList();)。
- readmavlinkdelegate数据显示委托,负责界面数据显示更新。
- Device构造函数,有几个参数不同的构造函数比如 public Device(ConnectType _type)。 Device dev =new Device(ConnectType.Tcp);这样实例化一个对象就是创建一个TCP/IP的连接。如果不带参数的创建,就是普通的串口连接。
- 还有些比如标识连接状态的函数IsConnect(三秒断开连接会置位),连接类型的函数ConnectType(标识是COM口连接还是TCP/IP连接)
3、多机控制的原理就是我们在原先的Device类里面扩充了TCP通讯方法,让飞机和地面站组成一个大型的局域网络。TCP网络是个大局域网,有了TCP通讯的方法,我们只需要每次添加一架飞机,就实例化对应的类即可
四、设备自动读取
为了不用每次上电都手动点击设备连接,设计了上电自动读取设备,自动连接的方式。通过读取XML配置文件,来达到自动读取的目的。
for (int i = 1; i <=5; i++)//Tool类里面做了自动连接的配置,在Set文件中配置了连接类型,程序上电自动连接设备
{
bool _have = false;
int n = 0;
for ( n = 0; n < Tool.ConfSet.Count; n++)
{
if (Tool.ConfSet[n].DeviceId == i)
{
_have = true;
break;
}
}
if (_have)
{
Device dev = new Device();
if (Tool.ConfSet[n].IsComm)
dev.ConnectType = ConnectType.Com;
else
dev.ConnectType = ConnectType.Tcp;
dev.linkEvent += Dv1_linkEvent;
dev.Index = i;
dev.ConnectState = Tool.ConfSet[n].IsConnect;
dev.ComPort = Tool.ConfSet[n].ComPort;
dev.IP = Tool.ConfSet[n].IP;
dev.Port = Tool.ConfSet[n].Port;
dev.Baud = 115200;
if (dev.ConnectState)
{
dev.Start();
}
SorlistDevice.Add(i, dev);
if (i == 1)
{
dv1 = dev;
}
}
else
{
Device dev = new Device(ConnectType.Tcp);
dev.ConnectState = false;
dev.Index = i;
dev.linkEvent += Dv1_linkEvent;
dev.Baud = 115200;
SorlistDevice.Add(i, dev);
Set se = new Set();
se.DeviceId = i;
se.IsConnect = false;
if (i == 1)
{
dv1 = dev;
}
Tool.ConfSet.Add(se);
}
说明: 我们计划做成自动写入航点的模式,就像用XML来自动连接设备一样。原理都一样,只要地面站可以手动写入航点,用自动脚本就可以写入。这是编队飞机之前航线写入的基础。