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一大堆,咱就不说了,
第一个函数,是定义一个tcp连接,监听所有的连接,端口号是通过界面设定的。
两个connect 一个是有新的链接过来,一个是销毁一个连接的时候触发,
readPendingDatagrams 函数比较复杂一点点,
因为会有很多的下位机连接到tcp端口,所以我们必须得给每一个下位机分配一个tcpSocket,这样每个下位机就是一个单独的个体,能够单独接收他发来的数据,也可以单独给他发送数据,client是一个数组,类型是一个class,表示的是一个下位机,包括名字,ip,还有socket变量,
因为我只有一台机器,IP地址还有name都是一样的,无法筛选制定的下位机,所以销毁函数没有实现。
前面说了,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都是一样的,无法筛选制定的下位机,所以销毁函数没有实现。
相关文章推荐
- 通过HttpWebRequest实现模拟登陆
- iOS开发笔记--Charles网络封包分析工具的使用
- Java使用HTTPClient3.0.1开发的公众平台消息模板的推送功能
- 简单的网络状态监听
- 网络编程知识(4)--Apache之HTTP协议
- Node中http模块详解(客户端篇)
- 【Swift】 GET&POST请求 网络缓存的简单处理
- 转:CentOS---网络配置详解
- MATLAB 神经网络基础(2)
- MATLAB 神经网络基础(1)
- 开源网络蜘蛛(Spider)一览
- Java HttpClient Post多层json格式参数
- TCP滑动窗口机制的简洁模型
- https的理解并结合nginx实际部署
- http://www.cnblogs.com/youfan/articles/3216816.html
- 【opencv】神经网络CvANN_MLP分类
- CentOS 6.5下本地yum源与网络yum源的配置使
- WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布
- 网络信息攻防平台-上传关
- HTTP POST请求报文格式分析与Java实现文件上传