• 13648阅读
  • 27回复

自用封装类——线程中使用QSerialPort串口类代码 [复制链接]

上一主题 下一主题
离线realfan
 

只看楼主 倒序阅读 楼主  发表于: 2015-01-30
— 本帖被 XChinux 执行加亮操作(2016-02-29) —
原来类中用了QWaitCondition,在某些情况下,会有问题,更新为QSemaphore。更新代码如下,请下载新代码:
20160301更新 myserialport.h (3 K) 下载次数:577 20160301更新 myserialport.cpp (11 K) 下载次数:591

20160301更新

=============================================================
相信很多Qter在多线程中使用通迅类,如QTcpSocket,QSerialPort类等,会遇到
QObject: Cannot create children for a parent that is in a different thread
这类提示吧。
关于Qt对象,线程已经有不少文章介绍了。
本人在编写程序时,用到串口通迅,也涉及线程调用问题,故封装了一个类。使用这个类,在使用串口通迅时,不必再考虑这个线程问题,不管在哪个线程,随意调用读写函数。
类接口:
MySerialPort(const QString strComName = "")
构造函数,可以直接传入串口名,Windows下,如 MySerialPort mycom("COM1");

bool setCOM(const QString strCOM, const int iBautRate=9600, const int iDataBits=8, const char chParity='N', const char chStopBits=1);
打开串口

qint64 write(const QByteArray & byteArray);
qint64 write(const char * data, qint64 maxSize = -1);

向串口写数据

void close();
关闭串口

void clear();
清除缓冲区

bool EchoCommand(const QString & strCmd, const QString& strExpectReply ="", QString * pstrReply = 0);
同步发送应答(此函数使用都可以按需要更改)

void sigDataReady(QByteArray)
非同步应答模式下,收到数据会发的信号
===================================================
下面这两个文件是老的,请下载前面更新的文件
myserialport.cpp (10 K) 下载次数:270 myserialport.h (3 K) 下载次数:229
离线liudianwu

只看该作者 1楼 发表于: 2015-01-31
不知道能不能承受大数据的并发,例如9600波特率每秒钟上千个字节的数据运算!
QtQML多多指教开发社区 http://www.heilqt.com
将QtCoding进行到底,做Qt的宠儿
群号:312125701
离线realfan

只看该作者 2楼 发表于: 2015-01-31
回 liudianwu 的帖子
liudianwu:不知道能不能承受大数据的并发,例如9600波特率每秒钟上千个字节的数据运算! (2015-01-31 15:12) 

没有测试过
目前我没有这样的应用场景
离线realfan

只看该作者 3楼 发表于: 2015-02-01
回 liudianwu 的帖子
liudianwu:不知道能不能承受大数据的并发,例如9600波特率每秒钟上千个字节的数据运算! (2015-01-31 15:12) 

这个类的目的是解决外部线程调用串口通迅类,出错的问题。
所以,吞吐量没有关注。
离线jienze

只看该作者 4楼 发表于: 2015-05-21
    QT5.1中才封装了QSerialport类,感觉不是很稳定。建议在工程中使用操作系统自带的函数进行串口的操作!
   在项目中,在LIUNUX下,本人封装了一个串口类,完全用底层操作函数编写,经过了大数据量的测试和工程检验。有需要的朋友,可以交流一下!我的邮箱是:jienze@163.com
      
欢迎交流合作~!!
离线z55716368

只看该作者 5楼 发表于: 2015-06-04
感谢版主的分享
每一个问题 都是一次进步
离线z55716368

只看该作者 6楼 发表于: 2015-06-04
回 realfan 的帖子
realfan:没有测试过
目前我没有这样的应用场景 (2015-01-31 15:45) 

有一个问题希望能帮我解答一下:对数据发送的异常处理,比如上位机正在向下位机(单片机)发送数据,然后数据线断了或者其他原因造成数据传输不成功,这个时候程序可能还会一直发数据(因为是自动发送),要怎么来捕获这个异常并且传给上层让上层处理?
每一个问题 都是一次进步
离线realfan

只看该作者 7楼 发表于: 2015-06-04
回 z55716368 的帖子
z55716368:有一个问题希望能帮我解答一下:对数据发送的异常处理,比如上位机正在向下位机(单片机)发送数据,然后数据线断了或者其他原因造成数据传输不成功,这个时候程序可能还会一直发数据(因为是自动发送),要怎么来捕获这个异常并且传给上层让上层处理? (2015-06-04 14:25) 

QSerialPort 有error信号,可以利用,看能否捕捉到你说的情况。
另外,上位机发送数据,是有返回的,发不成功上位机可以知道。
离线z55716368

只看该作者 8楼 发表于: 2015-06-04
回 realfan 的帖子
realfan:QSerialPort 有error信号,可以利用,看能否捕捉到你说的情况。
另外,上位机发送数据,是有返回的,发不成功上位机可以知道。 (2015-06-04 14:52) 

你好  如果是要做成try这个形式要怎么弄呢,这是第一次接触这种异常的处理 麻烦解答详细一点 有代价解释更好 万分感谢!你说的返回是指发送数据的长度吗? 那个我感觉只要你写进串口,它会给你返回,但是它不一定会发出去吧?
每一个问题 都是一次进步
离线realfan

只看该作者 9楼 发表于: 2015-06-04
回 z55716368 的帖子
z55716368:你好  如果是要做成try这个形式要怎么弄呢,这是第一次接触这种异常的处理 麻烦解答详细一点 有代价解释更好 万分感谢!你说的返回是指发送数据的长度吗? 那个我感觉只要你写进串口,它会给你返回,但是它不一定会发出去吧? (2015-06-04 16:14) 

try
{
....
}
catch()
{

}是处理异常的,写失败能否触发异常,需要试一下才知道。
我觉得从应用层面,可以认为返回发送的长度后,那个长度的数据已经传进目标口了。
离线z55716368

只看该作者 10楼 发表于: 2015-06-05
回 realfan 的帖子
realfan:try
{
....
}
....... (2015-06-04 22:05) 

你知道catch里面对于这种情况应该用什么异常吗?我没有找到。
然后,返回发送的长度如果有,也只能说明写入串口但是不知道发送的情况?
每一个问题 都是一次进步
离线xilanglang

只看该作者 11楼 发表于: 2015-06-09
你好,我看了你去年 关于【Qt5.3.0串口通讯依然有问题】的一篇文章,不知这次是上次的升级版嘛?
谢谢
不积跬步无以至千里
离线realfan

只看该作者 12楼 发表于: 2015-06-25
回 xilanglang 的帖子
xilanglang:你好,我看了你去年 关于【Qt5.3.0串口通讯依然有问题】的一篇文章,不知这次是上次的升级版嘛?
谢谢 (2015-06-09 18:12) 

那里面说的问题,应该是使用不当造成的。
这个应该是能解决那个问题吧。

只看该作者 13楼 发表于: 2016-02-29
版主,你太 B 了。我下载了你的代码,我去试试。
爱我你就抱抱我。

只看该作者 14楼 发表于: 2016-02-29
回 jienze 的帖子
jienze:    QT5.1中才封装了QSerialport类,感觉不是很稳定。建议在工程中使用操作系统自带的函数进行串口的操作!
   在项目中,在LIUNUX下,本人封装了一个串口类,完全用底层操作函数编写,经过了大数据量的测试和工程检验。有需要的朋友,可以交流一下 .. (2015-05-21 14:11) 

你好,我发你邮箱了。请查收。
帮我发一份吧。万分感谢。
爱我你就抱抱我。
离线realfan

只看该作者 15楼 发表于: 2016-03-01
今天代码做了更新,原来的有点问题,请下载最新的。
本帖提到的人: @XChinux
离线sunnlboy

只看该作者 16楼 发表于: 2016-04-07
谢谢!学习 一下!
离线key_person

只看该作者 17楼 发表于: 2016-04-15
我怎么下载了不是CPP文件啦?
<!doctype html>
<html>
<head>
<meta charset="gbk" />
<title>��ʾ��Ϣ - Powered by phpwind</title>
<meta name="generator" content="phpwind 8.7" />
<meta name="description" content="" />
<meta name="keywords" content="" />
<base id="headbase" href="http://www.qtcn.org/bbs/" />
<link rel="stylesheet" href="images/pw_core.css?20111111" /><!---->
<link rel="stylesheet" type="text/css" href="data/bbscache/wind_wind.css" />
<!---->
<!---->
<link rel="stylesheet" href="images/register/register.css?20111111" />
<style type="text/css">
p,ul,li{padding:0;margin:0;}
li{list-style:none}
.cp { cursor: pointer;}
</style>
<script type="text/javascript" src="js/core/core.js"></script>
<script type="text/javascript" src="js/pw_ajax.js"></script>
</head>
<body onKeyDown="try{keyCodes(event);}catch(e){}">
<div class="wrap">
    <div id="header">
        <div class="head_top"></div>
             <div id="head" class="cc">
                    <a href="http://www.qtcn.org/bbs/"><img src="images/wind/logo.png" class="fl" title="phpwind" /></a>
            </div>
    </div>
    <div class="main-wrap">
        <div id="main">
            <div id="pw_content">
                <div class="p20">
                    <div class="regTitle cc">
                        <h5 class="s6"><b>��ʾ��Ϣ</b></h5>
                    </div>
                    <div class="cc">                        <div class="regForm-wrap" style="min-height:80px;">
                            <div class="regForm">
                                <div class="regIgnore">
<p class="f14 mb10">��̳����:ˢ�2�Ҫ���� 5 ��</p><p class="f14"><a onclick="var needReload = (is_ie ? history.length == 0 : history.length == 1); if(needReload){self.location.reload();}else{history.back();}return false;" class="s4 cp" tabindex="20" id="showback"><u>���ؼ�������</u></a>������ <a id="showindex" tabindex="20" class="s4" href="http://www.qtcn.org/bbs"><u>������ҳ</u></a></p>
                                </div>
                            </div>
                        </div>

                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>
离线姜小白

只看该作者 18楼 发表于: 2016-04-23
Qt技术交流:QQ2499971906
离线ykc22cky

只看该作者 19楼 发表于: 2016-04-28
谢谢楼主,最近一直卡在多线程串口这个地方。楼主用的Qt是什么版本啊?
离线ranzhiyandi

只看该作者 20楼 发表于: 2016-05-09
楼主 为啥我一下载 两个文件都是1.8K大小 里面内容好像是这网页的小部分代码
离线韬铸88

只看该作者 21楼 发表于: 2016-10-11
回 jienze 的帖子
jienze:    QT5.1中才封装了QSerialport类,感觉不是很稳定。建议在工程中使用操作系统自带的函数进行串口的操作!
   在项目中,在LIUNUX下,本人封装了一个串口类,完全用底层操作函数编写,经过了大数据量的测试和工程检验。有需要的朋友,可以交流一下 .. (2015-05-21 14:11) 

你好,我发到你邮箱了,可以的话,给我发一份吧,谢谢!
离线fezl

只看该作者 22楼 发表于: 2016-11-08
好用,谢谢楼主,看到你又对QSerialPort封装了一层,你把它本身又弄到一个线程里面了,能否说一下原理是什么,为什么这么做就没有那个警告了
离线fezl

只看该作者 23楼 发表于: 2016-11-09
回 fezl 的帖子
fezl:好用,谢谢楼主,看到你又对QSerialPort封装了一层,你把它本身又弄到一个线程里面了,能否说一下原理是什么,为什么这么做就没有那个警告了 (2016-11-08 23:14) 

我又看了一下,等于是把它打包成一个单独的线程,然后对它的所有操作都是通过发信号完成,这样是否会影响效率呢
离线erichk

只看该作者 24楼 发表于: 2017-02-22
新手,楼主能不能再给个具体实体,好学习
离线lwfchat

只看该作者 25楼 发表于: 2017-10-02
  

只看该作者 26楼 发表于: 03-09
epoll
离线dddggg

只看该作者 27楼 发表于: 04-14
      
菜鸟
快速回复
限100 字节
 
上一个 下一个