Qt模擬串口-tcp連接發送數據

上一節已經基本上完成了qt界面的基本佈局,下面就是後臺數據的發送和接收了,
前面說了,qt和uc/os 交互使用的方式是tcp
爲啥要用tcp,而不使用別的呢,
udp:按道理udp是最好的,不用連接,想發就發,不用管端口。但是,qt這個鬼,他封裝的udp函數不支持服務器下發數據,也就是udp的服務器不能下發數據,只能接收。
串口:既然是串口通訊,爲啥不直接用串口呢。c語言對串口的支持太差了, 很不好用,qt到還好,找個插件就能完成,
所以最後就採用了tcp的傳輸方式,既可以收發,也可以同時對應多個下位機,

下面就是qt建立tcp服務器的代碼,
首先,導入tcp頭文件之前,得先再pro文件裏面加入這行代碼

QT += network

這個是幹什麼用的??好問題,
咱們打開qt的源碼包,—qt是開源的
你在 QT/Qt5.4.1/5.4/mingw491_32/include下面會看到有很多個文件夾,其中就有QtNetword,我們要導入的頭文件 QTcpServer.h 就在這個文件夾下面,所以在工程文件裏面導入netword文件夾,就可以了。

下面就是具體的代碼,tcp的工作原理啊,工作流程什麼的, google一大堆,咱就不說了,

int port = ui->comboBox->currentText().toInt();
    tcpSocket = new QTcpServer(this);
    tcpSocket->listen(QHostAddress::Any,port);
    connect(tcpSocket,SIGNAL(newConnection()),this,SLOT(readPendingDatagrams()));
    connect(tcpSocket,SIGNAL(destroyed()),this,SLOT(desConect()));
    void updComm::desConect()
{
    //tcpSocket->
    for(int i=0;i < clientindex;i++)
    {
        if(client[i].client->peerAddress().isNull())
        {
            showInfo("this is a null");

        }
    }

}
void updComm::readPendingDatagrams()
{    
    client[clientindex].client = tcpSocket->nextPendingConnection();
    client[clientindex].name = getUserName();
    client[clientindex].ip = client[clientindex].client->peerAddress();
    qDebug()<<client[clientindex].name;
    qDebug()<<client[clientindex].ip;
    connect(client[clientindex].client,SIGNAL(readyRead()),this,SLOT(readdataforclient()));
    QString data = tr("wxc");
    client[clientindex].client->write(data.toLatin1());
    clientindex++;
}

第一個函數,是定義一個tcp連接,監聽所有的連接,端口號是通過界面設定的。
兩個connect 一個是有新的鏈接過來,一個是銷燬一個連接的時候觸發,
readPendingDatagrams 函數比較複雜一點點,
因爲會有很多的下位機連接到tcp端口,所以我們必須得給每一個下位機分配一個tcpSocket,這樣每個下位機就是一個單獨的個體,能夠單獨接收他發來的數據,也可以單獨給他發送數據,client是一個數組,類型是一個class,表示的是一個下位機,包括名字,ip,還有socket變量,

因爲我只有一臺機器,IP地址還有name都是一樣的,無法篩選制定的下位機,所以銷燬函數沒有實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章