• 138353阅读
  • 117回复

串口调试助手(QT 4.4.3 + QextSerialPort 1.2) [复制链接]

上一主题 下一主题
离线csoapy
 

只看楼主 倒序阅读 楼主  发表于: 2008-11-13
— 本帖被 XChinux 执行加亮操作(2008-11-14) —
 
最新版 v1.05,QT4.6.2 + qtcreator,见三楼


有需要快速整合QextSerialPort的,请到这里下载 QextSerialPort安装包 & 示例代码



            欢迎使用 “我的串口

    本软件用VS 2005 + QT4.4.3 + QextSerialPort写成

    界面模仿串口调试助手

    源码在安装目录下的 source.7z

    有关源码或其它问题请联系:csoapy@126.com


        作者:后排男生
        2008 年 11 月 11 日 下午


    ——谨以此软件献给自己的节日!光棍节快乐!!

    ——向QextSerialPort的开发人员表示感谢!


=============================================================

版本历史
我的串口 V1.01
    修正了接收字节数不准的问题
    修正了10/16进制发送时多发一个空格的问题
    增加了BCD码和压缩BCD码的显示

============================================================

所需DLL列表:
    mirosoft.vc80.crt.mainifest
    mirosoft.vc80.debugcrt.mainifest   
    msvcm80.dll
    msvcp80.dll
    msvcr80.dll
    qtcore4.dll
    qtgui4.dll

==========================================================

备注:
    一、在显示接收数据的时候容易形成内存碎片,如果你长时间运行,
并且串口频繁发送数据包的话。
    除非数小时不停地收发数据,否则碎片问题应该不大,再加上
现在机器内存都很大,也就没有更正这一问题。
    二、本贴自发布以来已改动过几次,主要是源码,改动处如下:
        注释掉自动清空的两行代码
        增加BCD和压缩BCD码的显示
        更改安装包中的网址为本贴地址
        可执行程序与源码一致
    三、以后本贴不再改动。如有需要则以回复形式反映。


===========================================================

由于FTP(ftp://qtcnupload:qtcn.org@503.mygis.org:2200/)无法登录,我是教育网,现在只发源码包,安装包脚本,及部分截图





源码 source.zip (55 K) 下载次数:2444


安装脚本(将后缀名改成nsi即可) Setup.txt (5 K) 下载次数:824


可执行文件 MySerialPort.zip (29 K) 下载次数:1309

完整安装包(V1.04,包含源码,链接已失效,请到三楼下载最新版):
[url]http://www.namipan.com/d/d4b943042690cc4bc4f24bebbf531b47203b6706dabe4800[/url]
[ 此帖被csoapy在2011-05-26 19:38重新编辑 ]
离线aven152273

只看该作者 1楼 发表于: 2008-11-15
强人。
离线skywalker80

只看该作者 2楼 发表于: 2008-11-15
学习了
离线csoapy

只看该作者 3楼 发表于: 2008-11-16
补充说明:

最新版本:V1.05


以后有改动的地方均在这里说明。

有需要快速整合QextSerialPort的,请到这里下载 QextSerialPort安装包 & 示例代码


=========== v1.05================= 2010年4月20日 ============================
用QT 4.6.2 + qtcreator重写
修正了串口名称有时乱码的问题

时间关系,以下功能未完成,见谅。
  1. 自动清空
  2. 窗体大小可调,控件自动布局
  3. 双击LCDNumber自动清零
  4. 支持UNICODE,UTF8,GBK等
  5. 打包成一个独立的可执行文件


编译好的源码: MySerialPort v1.05.7z (420 K) 下载次数:1363

源码声明:这份代码您可以自由使用,但像这样连个招呼也不打就随便再次发布,我还是感到不爽,这是基本的礼貌问题。





=========== v 1.04 =========================================================
版本说明:V 1.04,按diyuanbo的建议——串口列表中的串口名改为系统中实际存在的串口名称,而不是1234什么的,实际有多少支持多少。
        这就用到QextSerialEnumerator类,可是在QextSerialPort的源码中仍然有会有LNK2019错误,原因也是没有引入必要的库:Setupapi.lib,按V 1.03时提供的方法改正即可。
        另外,我在代码中用的是#include <QextSerialEnumerator>,所以也要在QT目录中添加相应的头文件,具体方法同网上安装QextSerialPort的例子,不再赘述。

源码 V1.04 source.7z (85 K) 下载次数:576

可执行文件 V1.04 MySerialPort.7z (26 K) 下载次数:365  

完整安装包(V1.04,包含源码,链接已失效,请到下载上方的最新版):
[url]http://www.namipan.com/d/d4b943042690cc4bc4f24bebbf531b47203b6706dabe4800[/url]





=========== v1.03 =========================================================

有朋友来信问到 QextSerialPort 1.2  编译时的连接错误LNK2019,防止重复在这里一并回复:
        因为QextSerialEnumerator试图通过注册表来枚举当前的串口,但它用了RegQueryValueEx()等注册表函数却没有引入Advapi32.lib库,可能开发者们是在工程设置里面添加的这个库,而不是在代码里面,所以他们可以编译通过,我们通不过。

        知道了原因就好改了,在QextSerialEnumerator.h里面增加一条语句即可:
  1. #ifdef _TTY_WIN_
  2.     #include <windows.h>
  3.     #include <setupapi.h>
  4.     #pragma comment( lib, "Advapi32.lib" )              // added by csoapy
  5. #endif /*_TTY_WIN_*/

       另外,在用这个1.2版的时候发现了它的三个bug,已提交到:https://sourceforge.net/tracker/?group_id=127181&atid=708001

====================================================================


现有BUG:
    1·接收数据时如果在数据中间用鼠标点一下,则刚发上来的数据会显示在当前光标的位置,而不是追加到所有数据的后面。BUG状态:已修复。


源码 V1.03 source.zip (55 K) 下载次数:337


可执行文件 V1.03 MySerialPort.zip (29 K) 下载次数:208
[ 此帖被csoapy在2011-05-26 19:44重新编辑 ]
离线kuang906
只看该作者 4楼 发表于: 2008-11-16
强!
离线xjcook

只看该作者 5楼 发表于: 2008-11-18
引用第3楼csoapy于2008-11-16 11:28发表的  :
补充说明:
最新版本:V1.03
.......


已解决,谢谢楼主。
另外,提一个小建议,接收报文的时候,在显示时每一帧后面加一个回车,这样看起来方便些。
离线csoapy

只看该作者 6楼 发表于: 2008-11-18
引用第5楼xjcook于2008-11-18 12:00发表的  :
已解决,谢谢楼主。
另外,提一个小建议,接收报文的时候,在显示时每一帧后面加一个回车,这样看起来方便些。


        其实这个小工具是给我们学校一个实验室做的东西,在V1.01版后他们也提出了这个要求,因为自动清空我没做出来,所以就把自动清空改成自动换行了。

    之所以在V1.01后上传的不是V1.02而是V1.03,是因为V1.02按他们的要求做的。但我觉得这个自动换行不能够真实反应收到的数据,所以就没把它发上来。现在既然有人需要就发在这里吧。
    需要说明的是,在V1.03里面提到的那个修正后的BUG是V1.02时就已经修正了。

    下面是带自动换行的版本V1.02:

源码 V1.02  带自动换行 source.zip (84 K) 下载次数:216

可执行文件 V1.02  带自动换行 MySerialPort.zip (29 K) 下载次数:117
[ 此贴被csoapy在2008-11-18 14:36重新编辑 ]
离线xjcook

只看该作者 7楼 发表于: 2008-11-18
提供一个最简单有效的自动清空方法供参考,在你把要显示的东西添加到QTextEdit后,加上
if( ui.plainTextEdit_RecBuf->toPlainText().length() > 1000 )
    ui.plainTextEdit_RecBuf->setPlainText(ui.plainTextEdit_RecBuf->toPlainText().right(ui.plainTextEdit_RecBuf->toPlainText().length()/2));
并不是全部清空,是到1000个字符了清除前面一半,当然到多少,清多少自己说了算。

自动清空其实只是为了让连续运行时不要一直内存涨上去,如果全部清空又可能导致想看的数据不见了。

另外,楼主说的“自动换行不能够真实反应收到的数据”,我也发现了,就是发送端发送的一帧连续数据,到这个程序会被分帧,
如果作为一个串口监视软件的话,这样没有问题,如果需要处理数据的话,需要把几帧合并,就会比较烦。这个和串口的参数设置
有关,不知道楼主研究过没有。
离线csoapy

只看该作者 8楼 发表于: 2008-11-18
引用第7楼xjcook于2008-11-18 16:47发表的  :
提供一个最简单有效的自动清空方法供参考,在你把要显示的东西添加到QTextEdit后,加上
if( ui.plainTextEdit_RecBuf->toPlainText().length() > 1000 )
    ui.plainTextEdit_RecBuf->setPlainText(ui.plainTextEdit_RecBuf->toPlainText().right(ui.plainTextEdit_RecBuf->toPlainText().length()/2));
并不是全部清空,是到1000个字符了清除前面一半,当然到多少,清多少自己说了算。
.......


我想做的“自动清空”是指像龚博士的串口调试助手那样,当滚动条将要出现还未出现的时候就把显示内容清空。仅有现有字符的个数不能解决这个问题,比如每行一个数,十几行就出现滚动条了,但没有换行符时可能几百个字符也不会导致滚动条的出现。
    真正解决这个问题得一行行地算:根据当前字体大小、行数和最后一行的字符数来算出是否已经超出了当前窗口所能显示的字符数。比较麻烦,所以就没做。


你说的“串口参数设置”是不是指win平台上SetCommConfig()函数参数中COMMCONFIG结构体中的DCB结构体里面提到的一些东西?曾经试着理解里面的每一项,但是发现有很多涉及到通信知识的东西,看不懂,除了通常用到的选项其它的也就没再管。
离线xjcook

只看该作者 9楼 发表于: 2008-11-18
就是windows那个结构的参数,挺难懂的,我也理解不多,反正就是各个参数不停的试。÷

清空也没有必要做的像哪个软件一样,只要用者方便,实现简单就可以了。
离线天行健
只看该作者 10楼 发表于: 2008-11-18
佩服,好好学习一下!
离线yangar
只看该作者 11楼 发表于: 2008-12-09
下载下来学习一下..
离线leonidcn2008
只看该作者 12楼 发表于: 2008-12-18
请教一下 , 我用的是vs2008, 在dos 的 qextserialport (1.2 版本) 目录下面运行 qmake, 没有问题, 运行nmake, 编译出错, 是什么原因呢? 
离线diyuanbo

只看该作者 13楼 发表于: 2008-12-20
建议将串口组合框中自动枚举所有串口,而不是1、2、3、4,最好支持10以上的,波特率也可以支持921600
离线csoapy

只看该作者 14楼 发表于: 2008-12-22
引用第12楼leonidcn2008于2008-12-18 01:19发表的  :
请教一下 , 我用的是vs2008, 在dos 的 qextserialport (1.2 版本) 目录下面运行 qmake, 没有问题, 运行nmake, 编译出错, 是什么原因呢? 


具体是哪个错误?如果你没有改动它的源码的话,上面的方法是编译通不了的,会有个LNK2019错误。

纠正办法请参考本贴第三个回复。
离线csoapy

只看该作者 15楼 发表于: 2008-12-22
引用第13楼diyuanbo于2008-12-20 17:42发表的  :
建议将串口组合框中自动枚举所有串口,而不是1、2、3、4,最好支持10以上的,波特率也可以支持921600


谢谢关注!已按您的建议改好,更新后的代码已上传到本贴三楼。

另外,对于串口,过高的波特率容易出问题。有一些QextSerialPort不支持,如43000,921600等,有一些源码中注明了是Posix only或Windows only。所以为了减少麻烦,我就没有改源码。需要的话改一下QextSerialPort的源码再编译一下就是了。
离线yzy727

只看该作者 16楼 发表于: 2008-12-22
QextSerialPort是从哪里来的啊??在你源文件找不到啊!!!
你这个可执行wenjian可以在Linux下运行吗???
成就一番事业,早点结婚~~
离线银色子弹

只看该作者 17楼 发表于: 2009-03-03
搞了一天终于把QextSerialPort 1.2和你的这个串口调试助手运行起来了,头都大了
离线csoapy

只看该作者 18楼 发表于: 2009-03-04
呵呵,要是nokia能把它加入3dparty就好了,要是再能做个像VB里面那样的控件那就更好了,工控设备或手持设备上串口的应用还是很广泛的。

要自己下载源码编译是麻烦了些。
离线银色子弹

只看该作者 19楼 发表于: 2009-03-10
我想在控制台里面使用这个函数包,始终不能成功。出现的错误是E_WRITE_FAILED错误。

在你的源代码on_pushButton_Send_clicked()里在comm->write()后面加上以下语句:
comm->waitForBytesWritten(-1);
ulong error = comm->lastError();
if(0!=error)
{
    QMessageBox::critical(this, QString::fromLocal8Bit("错误"),
    QString::fromLocal8Bit("error = ")+QString::number(error));
}
也会显示error = 14。也就表示也出现了E_WRITE_FAILED错误。
请问怎样才能去除这个错误?
谢谢!!!!!
离线csoapy

只看该作者 20楼 发表于: 2009-03-12
引用第19楼银色子弹于2009-03-10 20:05发表的  :
我想在控制台里面使用这个函数包,始终不能成功。出现的错误是E_WRITE_FAILED错误。
在你的源代码on_pushButton_Send_clicked()里在comm->write()后面加上以下语句:
comm->waitForBytesWritten(-1);
ulong error = comm->lastError();
.......


不明白你为什么要waitForBytesWritten(-1)?这个程序里面有这么一行:comm->setQueryMode(QextSerialPort::EventDriven);而且是在on_pushButton_Send_clicked()的时候,岂不“Warning: Calling this function from the main (GUI) thread might cause your user interface to freeze.”?见:http://doc.trolltech.com/4.4/qiodevice.html#waitForBytesWritten

真正的原因我不清楚,猜是这样的:由于串口操作已被设为事件驱动模式,所以你再等它就报错。例如在windows里面用api操作串口的时候,是否用事件驱动可是写到操作系统的DCB(设备控制块)里面的。这时程序退出也无法把该模式改成轮询模式的,除非重启或把这个模式再改回来。

以前工作中也遇到过相关的问题,一个串口程序用的是轮询模式(win默认),另一个用事件驱动。两个程序单独拿到任一台机器上都没问题,就是在同一台机器上运行时,后面那个程序运行一次后,前面那个就不干活了,很是奇怪。费了好大个劲才把问题给找出来,就是串口工作模式的问题。后面那个程序在退出的时候没有把模式给设回默认值,前面那个在程序开始运行的时候没有把工作模式设置成自己用的那种。两个程序改哪个都可以,不过前面那个责任要大一些,”你在使用之前不检查或设置一下自己使用的模式吗“——因为后者无法保证总是把工作模式设回原样(例如异常退出的时候)。

所以工作模式这个地方还是要注意一下的。
离线银色子弹

只看该作者 21楼 发表于: 2009-03-16
领教了,太谢谢了!
离线tgvlcw
只看该作者 22楼 发表于: 2009-03-16
我的GSM模块的波特率用的是9600,住GSM模块里发at命令的时候,总是返回错误,而且接收的时间很长!而我直接用你的这个程序接我的开发板,正常接收啊!不知道这是什么原因!
离线csoapy

只看该作者 23楼 发表于: 2009-03-16
现场情况不大清楚,是不是和发送文本的编码有关?还有,记得at命令以回车符为结束标志,是不是“住”GPS模块里面发命令的时候没有发送回车符0x0D?有没有用个串口监视工具,比如Servial Trace,跟踪一下看看两个程序对串口参数的设置和下发的数据到底有何不同?
离线daidaidai
只看该作者 24楼 发表于: 2009-04-01
牛人啊~
离线may1232008
只看该作者 25楼 发表于: 2009-04-02
强!支持楼主!!
离线yeguoxiong

只看该作者 26楼 发表于: 2009-04-08
其没必要,先编译成DLL文件的。只须将原文件直接用就OK了,在Windows下把linux的去掉,在linux平台下把windows下的代码去掉就OK了。我现在这个项目就是这样做到的。经测试稳定性还很高。
离线cznc
只看该作者 27楼 发表于: 2009-04-09
无VS工具、串口调试助手作为(QextSerialPort 1.2)的一个example通过命令行编译成功
未安装VS这套庞然大物的人,无法分享串口调试助手.source.rar所带MySerialPort.sln、MySerialPort.suo、MySerialPort.vcproj文件所包含的编译配置信息;可以参考下面的步骤 通过qmake来自建编译配置文件;

1,解压qextserialport-1.2win-alpha.rar,进入之、qmake&&make之;备用;

2,解压source.rar将其中MySerialPort目录整个解压放到qextserialport-1.2win-alpha\examples下,进入之、qmake -project之,得到MySerialPort.pro,参照enumerator/enumerator.pro修改之;主要是增加:
2.1,指定qextserialport的头文件和库文件所在目录:
INCLUDEPATH += ../..
QMAKE_LIBDIR += ../../build
2.2,指定qextserialport的库文件:
CONFIG(debug, debug|release):LIBS  += -lqextserialportd
else:LIBS  += -lqextserialport
2.3,必要的宏以便区分平台:
unix:DEFINES   = _TTY_POSIX_
win32:DEFINES  = _TTY_WIN_

2,myserialport.cpp转换编码方式到ansi(作者误用了unicode编码方式编译时出来一堆warning: null character(s) ignored);转换后该文件大小由23k变为13K;

4,改为#include <qextserialport.h>(全部小写,因为该头文件名从框架是全部小写的)
myserialport.h中亦然;

5,make之编译通过生成;

6,make clean发现不能正确删除由make生成的目标文件、可执行文件,请人帮忙研究下。
离线tanqianguo
只看该作者 28楼 发表于: 2009-04-09
牛人,向你学习
离线ccllcc2006
只看该作者 29楼 发表于: 2009-04-13
好好学习一下!
离线haolee
只看该作者 30楼 发表于: 2009-04-20
问一下怎么在vs2008+QT中添加库qextserialport.lib,我现在都是在command prompt中编辑qmake -project生成的pro来添加的,
怎样让vs识别我的pro编译配置文件?先谢谢了!
离线csoapy

只看该作者 31楼 发表于: 2009-04-20
引用第30楼haolee于2009-04-20 17:05发表的  :
问一下怎么在vs2008+QT中添加库qextserialport.lib,我现在都是在command prompt中编辑qmake -project生成的pro来添加的,
怎样让vs识别我的pro编译配置文件?先谢谢了!


在代码中添加:#pragma comment( lib, "xxxx" )
或者在"工程“->”属性“里面添加。

pro文件是给qmake用的,你如果装了qt-vsintegration和qt-win-commercial for vs2008的话不用考虑.pro。不过这两个都是要收费的,建议用qt4.5的qtcreator。
[ 此帖被csoapy在2009-04-20 20:27重新编辑 ]
离线银色子弹

只看该作者 32楼 发表于: 2009-04-27
我现在的程序需要不停的对串口的数目进行扫描,在使用QextSerialEnumerator类的时候会使内存不停的增长。调试后发现是反复调用QList<QextPortInfo> QextSerialEnumerator::getPorts()导致的,看了源代码,但是没有发现错误的原因。向高手请教!
离线zheng501gf

只看该作者 33楼 发表于: 2009-04-27
yserialport.cpp
.\myserialport.cpp(18) : error C2039: “setQueryMode”: 不是“QextSerialPort”的成员
        d:\qt\4.4.3\include\qtgui\../../src/qextserialport/qextserialport.h(16) : 参见“QextSerialPort”的声明
.\myserialport.cpp(18) : error C2039: “EventDriven”: 不是“QextSerialPort”的成员
        d:\qt\4.4.3\include\qtgui\../../src/qextserialport/qextserialport.h(16) : 参见“QextSerialPort”的声明
.\myserialport.cpp(18) : error C2065: “EventDriven”: 未声明的标识符

请教一下!

不知道我编译时会出现上面这个错误?


我想再linux下编译一下,不知道怎么编译?

多谢
离线csoapy

只看该作者 34楼 发表于: 2009-04-28
引用第33楼zheng501gf于2009-04-27 20:36发表的  :
yserialport.cpp
.myserialport.cpp(18) : error C2039: “setQueryMode”: 不是“QextSerialPort”的成员
        d:qt4.4.3includeqtgui../../src/qextserialport/qextserialport.h(16) : 参见“QextSerialPort”的声明
.myserialport.cpp(18) : error C2039: “EventDriven”: 不是“QextSerialPort”的成员
        d:qt4.4.3includeqtgui../../src/qextserialport/qextserialport.h(16) : 参见“QextSerialPort”的声明
.......


你用的QextSerialPort 不是1.2版?另外它目前的版本仍然是alpha - 1.2win-alpha Last Update: Sep 06 2007
也就是在这个版本里面才引入事件机制的,但只有win版,linux和mac都没有。
离线xiamenxw
只看该作者 35楼 发表于: 2009-04-28
羡慕啊!加油!
我很菜,但是我想我可以!
离线银色子弹

只看该作者 36楼 发表于: 2009-04-29
高手,我第32楼的问题能看一下吗?
离线csoapy

只看该作者 37楼 发表于: 2009-04-29
引用第32楼银色子弹于2009-04-27 14:44发表的  :
我现在的程序需要不停的对串口的数目进行扫描,在使用QextSerialEnumerator类的时候会使内存不停的增长。调试后发现是反复调用QList<QextPortInfo> QextSerialEnumerator::getPorts()导致的,看了源代码,但是没有发现错误的原因。向高手请教!



有三个可以怀疑的地方, QList 的实现,QextSerialEnumerator::getPorts()的实现,和QList的使用(你的代码),可疑程度依次递增。如果怀疑getPorts()的话,最好到MSDN查下它调用的setupAPIScan()里面用到的api函数有没有什么关于资源使用的注意事项。

好在涉及的代码不多,排除问题应该不麻烦。
离线zheng501gf

只看该作者 38楼 发表于: 2009-05-04
请教楼主问题

我想在LINUX 用QT和QextSerialPort 1.1直接向串口ttyS1写个十六进制的的数字,我首先是新建一个串口,打开,写数距,关闭,可就是没反映。
望指点一下!

急急!!等!

谢谢
离线csoapy

只看该作者 39楼 发表于: 2009-05-04
不好意思,没在linux下弄过串口,也不知道linux下有没有串口监视的工具。
先排除硬件错误,把串口的收发脚短接起来,用第三方测试一下收发是否正常。然后再用你的程序往里面写数据,看看能收到发送的数据不?
    另外还可以单步跟踪,看看写操作的返回值什么的。
快速回复
限100 字节
 
上一个 下一个