您的位置:首页 > 理论基础 > 计算机网络

Qt模拟串口-tcp连接发送数据

2016-05-10 10:30 811 查看
上一节已经基本上完成了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都是一样的,无法筛选制定的下位机,所以销毁函数没有实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: