找回密码
 立即注册
收起左侧

如何实现多线程串口通信

11
回复
24069
查看
[复制链接]
累计签到:344 天
连续签到:1 天
来源: 2014-12-9 10:10:20 显示全部楼层 |阅读模式
2Qter豆
求各位大哥告诉我下如果在别的线程中实现串口通信。比如我在主线程中开多一个次线程。然后有两个串口来同时收发数据。可是我发现只能在主线程中实现串口通信,而次线程中无论如何都没反应。他会出现下图这样的警告。请各位大哥大姐知道怎么解决的告诉我下,最好有已经通过编译的代码,本人用的是QT5.3.2.win7的环境。因为是初学者,我看了书上说是无法在主线程以外的线程中使用GUI类的问题,这个我也知道,但是具体要怎么解决又没说,就说了可以将一些非常耗时的操作放在一个单独的工作线程中来进行。可是代码呢,例子呢,要怎么做啊,真心看不懂。比如我现在这个多线程串口通信要如何实现呢?请别理论和我讲,我需要代码实例来解析
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

嗯。多线程串口通信的问题有很多人问了,是时候该总结整理下了。我们抽时间出一个相关的教程。
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-12-9 10:10:21 显示全部楼层
cai901022 发表于 2014-12-25 16:14
这个我知道啊,书上都有说了,但是书上那个例子不全,我需要一个简单的可以编译通过的例子来看看,就像书 ...

嗯。多线程串口通信的问题有很多人问了,是时候该总结整理下了。我们抽时间出一个相关的教程。
参与人数 1人气 +1 收起 理由
cai901022 + 1 期待早点出教程

查看全部评分总评分 : 人气 +1

回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-12-17 20:05:00 显示全部楼层
书上有个例子的。简单来说,就是像普通程序那样编写界面,然后创建一个新的线程类,在里面进行串口通信操作,通过信号和槽实现与界面的数据通信。
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-19 09:31:17 显示全部楼层
yafeilinux 发表于 2014-12-17 20:05
书上有个例子的。简单来说,就是像普通程序那样编写界面,然后创建一个新的线程类,在里面进行串口通信操作 ...

按照你说的那样,还是出现如我发图的那种情况。书上的例子我看了,但是还是不懂。有没有具体代码给我参考下呢。直接文字说明真心弄不明白。我只要要多线程两个串口同时发信息的简单例子就可以了
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-12-19 10:32:52 显示全部楼层
cai901022 发表于 2014-12-19 09:31
按照你说的那样,还是出现如我发图的那种情况。书上的例子我看了,但是还是不懂。有没有具体代码给我参考 ...

两个串口同时发信息的例子现在没有,也没有相关的设备进行测试。只能说怎么来做,具体还是需要自己动手实现的。

创建Qt界面项目,先设计好界面,然后向项目中添加一个继承自QThread的自定义类,其中的构造函数中初始化串口,run()函数里面实现串口读取或发送,比如说进行读取操作,可以通过信号槽方式将收到的数据传送给界面类。

先测试多线程一个串口的,成功了再测试两个串口的。
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-22 13:47:33 显示全部楼层
yafeilinux 发表于 2014-12-19 10:32
两个串口同时发信息的例子现在没有,也没有相关的设备进行测试。只能说怎么来做,具体还是需要自己动手实 ...

这个方法我很早就实现了,也就是说在次线程中处理要发的数据,然后发信号给主线程来进行串口通信,其原理其实还是主线程中串口的通讯。但这并不是我想要的,我想要的是如何在次线程中也可以实现串口的write和read。查了许久有一个关于movetothread的东西,而不是run()函数来实现线程的。我问这个问题,其实就是想要有人教我用这个方法来实现多线程串口通讯。
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-12-23 23:42:02 显示全部楼层
cai901022 发表于 2014-12-22 13:47
这个方法我很早就实现了,也就是说在次线程中处理要发的数据,然后发信号给主线程来进行串口通信,其原理 ...

这个函数是可以实现将主线程中的槽直接在其他线程执行,但是涉及到的一些问题还是需要自己处理的。
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-25 16:14:54 显示全部楼层
yafeilinux 发表于 2014-12-23 23:42
这个函数是可以实现将主线程中的槽直接在其他线程执行,但是涉及到的一些问题还是需要自己处理的。 ...

这个我知道啊,书上都有说了,但是书上那个例子不全,我需要一个简单的可以编译通过的例子来看看,就像书上还有论坛的教程来看,都是只提了下,要么就是复制粘贴的残缺例子,根本就是不能编译通过的,yafeilinux大大不如你辛苦下写个例子吧,我好结帖。关于我这个帖子的问题基本上是可以用这个方法来实现的。
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2014-12-26 11:17:59 显示全部楼层
cai901022 发表于 2014-12-19 09:31
按照你说的那样,还是出现如我发图的那种情况。书上的例子我看了,但是还是不懂。有没有具体代码给我参考 ...

根据你现在的情况,你没有必要使用多线程。如果只是接收串口数据就多开一个线程的话。这个线程也太浪费了些。其实你只要声明多个串口类,就完全可以实现从多个串口接收数据了。
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2015-2-4 09:17:39 显示全部楼层
hzzhou 发表于 2014-12-26 11:17
根据你现在的情况,你没有必要使用多线程。如果只是接收串口数据就多开一个线程的话。这个线程也太浪费了 ...

迟来的回复,关于这个问题我最后就是按照你说的这样来解决的。抱歉之前有事一直没上线。
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2016-7-15 11:12:40 显示全部楼层
我想在GUI线程下新建一个子线程,这个子线程用于处理串口的收发,串口对象在线程里创建,使用异步的方式接收数据,如myCom = new QextSerialPort(m_portName, QextSerialPort::EventDriven);
打开与关闭串口的命令在主界面GUI上实现,即主界面上打开则调用子线程,在子线程中新建串口,在主界面上关闭,则让子线程中的串口关闭,且结束子线程


这样如何实现呀
回复

使用道具 举报

尚未签到

2017-6-9 22:08:50 显示全部楼层
cai901022 发表于 2015-2-4 09:17
迟来的回复,关于这个问题我最后就是按照你说的这样来解决的。抱歉之前有事一直没上线。 ...

你好,看完帖子不是很明白如何实现的,能不能贴写思路性的代码呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了