最近一段时间,需要完成项目中关于Linux下使用串口的一个部分,现在开帖记录过程点滴。
项目的要求是这样的,Qt应用程序主要完成数据采集和发送功能,一开始在google中海搜关键字“Qt串口编程”,得出的结论是:
一、Qt自己的类中没有关于串口的类,不过有人做了一个第三方的类:qextserialport。可以在如下地址下载到:
或者
二、关于qextserialport,下载下来的文件中会自带比较详细的HTML文档介绍,不过都是英文哦!而且有版本对应,目前的认识是0.9之后的使用于qt4。
三、以下文章是讲qextserial的编译的,不过好像用处不大。http://www.cnblogs.com/leaway/archive/2008/03/13/1104562.html
四、也可以不用这个类,直接调用linux的系统函数。Linux中“万物皆文件”,所以串口也不例外。只要利用open()函数打开设备,用read()和write()函数读写串口,用close()关闭即可。另外,对于串口需要设置一些参数。
五、继续往下搜,一篇号称“Linux下串口编程Bible”的文章《Serial Programming Guide
for POSIX Operating
Systems》浮出水面,不过照样是英文的。以下网址可以在线阅读或下载。
开始试着在Linux下编译下载的例子。
[root@localhost qextserialport-0.9.0]# ls
Changes
qextserialbase.cpp
qextserialport.pro
html
qextserialbase.h
win_qextserialport.cpp
posix_qextserialport.cpp
qextserialport.cpp
win_qextserialport.h
posix_qextserialport.h
qextserialport.h
[root@localhost
qextserialport-0.9.0]# vi qextserialport.pro
[root@localhost
qextserialport-0.9.0]# qmake -o Makefile qextserialport.pro
[root@localhost
qextserialport-0.9.0]# vi makenbsp;
[root@localhost
qextserialport-0.9.0]# vi Makefile
[root@localhost
qextserialport-0.9.0]# make
g++ -c -pipe -Wall -W -g -D_REENTRANT
-fPIC -D_TTY_POSIX_ -DQT_THREAD_SUPPORT
-I/usr/local/qt-x11-free-3.3.6/mkspecs/linux-g++ -I.
-I/usr/include/freetype2 -I../../include -Imoc/ -o
obj/qextserialbase.o qextserialbase.cpp
g++ -c -pipe -Wall -W -g -D_REENTRANT
-fPIC -D_TTY_POSIX_ -DQT_THREAD_SUPPORT
-I/usr/local/qt-x11-free-3.3.6/mkspecs/linux-g++ -I.
-I/usr/include/freetype2 -I../../include -Imoc/ -o
obj/qextserialport.o qextserialport.cpp
g++ -c -pipe -Wall -W -g -D_REENTRANT
-fPIC -D_TTY_POSIX_ -DQT_THREAD_SUPPORT
-I/usr/local/qt-x11-free-3.3.6/mkspecs/linux-g++ -I.
-I/usr/include/freetype2 -I../../include -Imoc/ -o
obj/posix_qextserialport.o posix_qextserialport.cpp
test -d lib/ || mkdir -p lib/nbsp; rm -f
libqextserialport.so.1.0.0 libqextserialport.so
libqextserialport.so.1 libqextserialport.so.1.0
g++
-Wl,-rpath,/usr/local/qt-x11-free-3.3.6/lib -shared
-Wl,-soname,libqextserialport.so.1
-Wl,-rpath,/usr/local/qt-x11-free-3.3.6/zhf_work/qextserialport-0.9.0/lib
-o libqextserialport.so.1.0.0 obj/qextserialbase.o
obj/qextserialport.o
obj/posix_qextserialport.o
-L/usr/local/qt-x11-free-3.3.6/lib -lqt-mt -lpthread
ln -s libqextserialport.so.1.0.0 libqextserialport.sonbsp;
ln -s libqextserialport.so.1.0.0
libqextserialport.so.1
ln -s libqextserialport.so.1.0.0
libqextserialport.so.1.0
rm -f
lib/libqextserialport.so.1.0.0nbsp;
rm -f
lib/libqextserialport.so
rm -f
lib/libqextserialport.so.1
rm -f
lib/libqextserialport.so.1.0
mv -f libqextserialport.so.1.0.0
libqextserialport.so libqextserialport.so.1
libqextserialport.so.1.0 lib/
一下子轻易通过编译,还真的是不敢相信,不过后来发现这个根本没用,因为我需要做到是把这个现成的类添加到我的工程之中,而不是要用它的.o文件。编译通过只说明现在下载的版本是没有语法错误的哈哈。
最近一段时间搞了两天,几近崩溃,好在晚饭前终于曙光降临。我用Posix_qextserialport类实现了串口的写数据,看到数据接收到的一刻,突然感觉所有的事情都不再困难。而之前所有的努力也因为这一刻的到来而充满了意义。
一、做到向串口写数据和读数据,最后做个小界面,完善一下,直观一点。
二、与原有程序结合,实现原来的预想功能。
三、顺便研究调用第三方类和直接使用linux的要求是这样的,Qt应用程序主要完成数据函数两种方式,总结成文。
无论是Win还是Lin ,最近一段时间,都是下载源码包,然后放到源码目录src下,然后,需要完成项目中关于Linux下使用串口qmake
make,即可得到对应的库文件。在Win的要求是这样的,Qt应用程序主要完成数据下是qextserialport.dll,qextserialport.prl,libqextserialport.a,需要将第一个复制到Qt安装目录下的,后面两个放在Qt安装目录的lib下。
继续努力。今天定下的两条指导思想:
1、要研究qextserialport的文档,因为它是为Qt编写的类,集成了Qt文档丰富的优点,而且风格是与Qt的其他类是完全类似的。
2、要研究1.1版本的例子,虽然0.9版本没有例子,但是版本的延续是一脉相承的。所以看后续版本的例子也有一些启发。
一个是乱码问题。
原以为昨天解决了大部分问题今天就可以正常接收了,没想到接收到的全是乱码。后来想来想去觉得只有串口的波特率设置是可能造成影响的。可是我的发送端和接
收端全是一样是9600啊。无奈,看到梁哥那个串口调试工具是115200,DNW也是,我就把波特率全部设置成了115200。果然可以了,而且另外一
个发现是:只能是这一种,设置成其他的,一样都不行,高于115200也不行,真不知道波特率由什么决定的啦。不过通信中真是太重要了,一不匹配就什么也
得不到。
第二个问题是:当我传输的文本较大时(其实没有多大,只有2000多bytes),服务器就只能接收到前面一部分了,原来以为它分了多次也应该能够收到,但是就是没有!
我想过了各种可能,并尝试了各种小试验验证,逐一排查。
试验一:利用电脑的串口向DTU发送较长数据,发现接收正常,反过来也是正常的。
这下我认定DTU肯定没有问题,出问题的肯定只有自己发送端的程序了。我查看了qestserialport的源代码,发现里面并没有给发送的大小设置限制。nbsp;
项目
试验二:在发送端采用拆包发送机制,一次发送不超过1024,结果发现现象还是跟原来一样没变化。
最后没办法,把qextserialport的父类,爷爷类,太爷爷类都翻出来看。发现其祖上居然是Qt中的QIODevice,这东西真是太好了,因为
QSocket也是其同脉子孙,既然如此,可以用原来程序的思路。这样,我用出了最后一招(GOD,这招要是不管用,我真的没招
了!):QString->QTextStream->QIODevice(Qtxtserialport)
哈哈,可以了!