上一節已經基本上完成了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都是一樣的,無法篩選制定的下位機,所以銷燬函數沒有實現。