查看完整版本: [-- 自用封装类——线程中使用QSerialPort串口类代码 --]

QTCN开发网 -> Qt代码秀 -> 自用封装类——线程中使用QSerialPort串口类代码 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

realfan 2015-01-30 23:57

自用封装类——线程中使用QSerialPort串口类代码

原来类中用了QWaitCondition,在某些情况下,会有问题,更新为QSemaphore。更新代码如下,请下载新代码:
[attachment=14837][attachment=14836]

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)
非同步应答模式下,收到数据会发的信号
===================================================
下面这两个文件是老的,请下载前面更新的文件
[attachment=13210][attachment=13211]

liudianwu 2015-01-31 15:12
不知道能不能承受大数据的并发,例如9600波特率每秒钟上千个字节的数据运算!

realfan 2015-01-31 15:45
liudianwu:不知道能不能承受大数据的并发,例如9600波特率每秒钟上千个字节的数据运算! (2015-01-31 15:12) 

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

realfan 2015-02-01 21:55
liudianwu:不知道能不能承受大数据的并发,例如9600波特率每秒钟上千个字节的数据运算! (2015-01-31 15:12) 

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

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

z55716368 2015-06-04 14:21
感谢版主的分享

z55716368 2015-06-04 14:25
realfan:没有测试过
目前我没有这样的应用场景 (2015-01-31 15:45) 

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

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

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

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

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

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

try
{
....
}
catch()
{

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

z55716368 2015-06-05 08:19
realfan:try
{
....
}
....... (2015-06-04 22:05) 

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

xilanglang 2015-06-09 18:12
你好,我看了你去年 关于【Qt5.3.0串口通讯依然有问题】的一篇文章,不知这次是上次的升级版嘛?
谢谢

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

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

谢谢谢123456 2016-02-29 11:36
版主,你太 B 了。我下载了你的代码,我去试试。

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

你好,我发你邮箱了。请查收。
帮我发一份吧。万分感谢。

realfan 2016-03-01 09:04
今天代码做了更新,原来的有点问题,请下载最新的。

sunnlboy 2016-04-07 21:16
谢谢!学习 一下!

key_person 2016-04-15 14:57
我怎么下载了不是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>

姜小白 2016-04-23 09:58

ykc22cky 2016-04-28 00:59
谢谢楼主,最近一直卡在多线程串口这个地方。楼主用的Qt是什么版本啊?

ranzhiyandi 2016-05-09 15:41
楼主 为啥我一下载 两个文件都是1.8K大小 里面内容好像是这网页的小部分代码

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

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

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

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

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

erichk 2017-02-22 10:02
新手,楼主能不能再给个具体实体,好学习

lwfchat 2017-10-02 23:25
  

哥依然潇洒 2018-03-09 15:42
epoll

dddggg 2018-04-14 12:17
      

shokokawaii 2023-10-22 09:10


查看完整版本: [-- 自用封装类——线程中使用QSerialPort串口类代码 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled