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

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

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

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

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

 

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值