上一节已经基本上完成了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都是一样的,无法筛选制定的下位机,所以销毁函数没有实现。