1,当前 与无人机的通信无外乎两种:

tcp:涉及到参数为ip与端口。用于正式的数据交互。

串口:涉及到的参数为端口号与波特率,因为串口其他参数相对固定,并且端口号可以与VID绑定,所以串口可固定参数为VID与波特率。串口一般用于调试使用。

而真正的使用过程中,通用的函数大致分为四种。连接、断开、收数据、发数据。因此可将此两种方式利用工厂模式进行封装,用户设置好参数,即可随时切换两种使用方式。大致设置如下:

基于工厂模式的 无人机连接方式( tcp、串口)


2,工厂模式实现

(1)定义 纯虚基类,声明 三个public函数,用于连接、断开、发送数据。并声明一个信号,用于数据的接收。

class PVCORESHARED_EXPORT AbstractLinkProduct:public QObject{

    Q_OBJECT
public:
    AbstractLinkProduct();
    virtual ~AbstractLinkProduct();//虚 析构函数

public:
    virtual bool connect()=0;
    virtual void disConnect()=0;
    virtual void sendData(const char*buff,qint64 size)=0;

signals:
    void bytesReceived(const char*buff,qint64 size);
};

(2),声明 具体的串口 和tcp 实现类

//串口连接
class SerialLink:public AbstractLinkProduct{

    Q_OBJECT
public:
    SerialLink(QString _VID="",QString _baud="");
    virtual ~SerialLink();

private:
    SerialThread *serialThread;

public:
    virtual bool connect();
    virtual void disConnect();
    virtual void sendData(const char*buff,qint64 size);
};

//tcp,dup连接
class SocketLink:public AbstractLinkProduct{

    Q_OBJECT
public:
    SocketLink(QString _ip="",QString _port="", QAbstractSocket::SocketType type=QAbstractSocket::TcpSocket);
    virtual ~SocketLink();

private:
    PVSocket* socket;
    QAbstractSocket::SocketType socketType;

public:
    virtual bool connect();
    virtual void disConnect();
    virtual void sendData(const char*buff,qint64 size);
};


(3),不同对象的实现

class PVCORESHARED_EXPORT AbstractLinkFactory{

public:
    AbstractLinkFactory();
    virtual ~AbstractLinkFactory();

public:
    virtual AbstractLinkProduct* createProduct(LinkParameter link) = 0;
};


class PVCORESHARED_EXPORT LinkFactory:public AbstractLinkFactory{

public:
    LinkFactory();
    ~LinkFactory();

public:
    AbstractLinkProduct* createProduct(LinkParameter link);
};


AbstractLinkProduct* LinkFactory::createProduct(LinkParameter link){
    AbstractLinkProduct* temp = NULL;
    switch(link.type)
    {
    case TypeSerial:
        temp = new SerialLink(link.vid,link.baud);
        break;
    case TypeTcp:
        temp = new SocketLink(link.ip,link.port,QAbstractSocket::TcpSocket);
        break;
    case TypeUdp:
        temp = new SocketLink(link.ip,link.port,QAbstractSocket::UdpSocket);
        break;
    default:
        break;
    }
    return temp;
}


(4),连接 参数 由界面设置 传入,结构体如下

struct LinkParameter
{
    LinkType type;

    //串口设置
    QString vid;
    QString baud;

    //网络设置
    QString ip;
    QString port;
};


3,使用方式

(1),传入 连接参数,并绑定 信号与槽,进行数据的接收

 factory = new LinkFactory();
    product = factory->createProduct(link);
    QObject::connect(product,SIGNAL(bytesReceived(const char*,qint64)),this,SLOT(sl_bytesReceived(const char*,qint64)),Qt::DirectConnection);
    assert(product);


(2)连接或者断开

bool MainboardPVW4::connect()
{
    heartbeat=0;
    try
    {
        return product->connect();
    }
    catch(const std::exception&exp)
    {
        qDebug()<<"MainboardPVW4::connect()->Exception encountered"<<exp.what()<<endl;
    }
}

void MainboardPVW4::disConnect()
{
    product->disConnect();
}


(3)用户 只需设置一次关键参数,即可随便切换连接方式。代码中在 数据解析处 可针对收到的数据进行具体的解析。

相关文章: