由于项目需要,实现在linux下qt串口通信问题,搞了一周,算是实验通过了,记录一下。

     主机:ubuntu11.04 qt版本:4.7.2

        当要实现在linux下qt串口通信时,首先查看qt有没有自带的类,如果有自带的类,实现起来是最方便的,但令人遗憾的时,没有,但可以使用QIOdevice,因为在linux下,万物结文件,但是,我不想用这种方式,太麻烦了,所有的一切都要自己来实现,于是在网上继续查找。

     1,就是用网上都在用的yafei linux 的那个linux串口通信全程图文讲解。这个类第一次看到我很兴奋,因为它太好用了,而且教程一步一步都有解释,对我这种菜鸟再好也不过了,可是网上有很多人说在linux下用这不爽,因为在读串口时,容易使串口连续读而卡死,于是我在犹豫了,继续再找一种方法吧于是就找到了第2中方法

    2,线程+定时器实现linux下qt串口通信:http://lizzy115.blog.163.com/blog/static/36491958201041593711817/ 这是链接,我用了一下,能编译通过,可是现在需求有变化了,需要查询程序运行的机器上可以使用的串口总数,以实现自动连接。于是这中方式就不能完全满足要求了,于是回过头来继续研究yafei linux的那个类,因为里面有个enumerator的类,就是用来满足我的这种需求的。

3,刚开始使用这个类的时候怎么也不能编译通过,我检查语法也没有问题,于是我把enumerator这个类的头文件重新抄写了一遍,什么都没变,神奇的时,编译通过了,qt这个大变态,怎么能这么捉弄人呢,不过看到能编译通过,我还是很欣慰的,于是就调用了enumerator类的getports(),这个方法就是专门用来实现机器上可以使用的串口个数,名称等信息的,等我信心漫漫的等待结果发生时,结果是出现了:给我打印了一句:"Enumeration for POSIX systems is not implemented yet.",跟踪定位发现在enumarator的实现文件的getports()方法中,原来这个类在POSIX系统中还没有实现,这个让我情何以堪啊,我可是搞了几天了。但是问题还是没有解决啊,于是在网上继续游荡,发现了一个俄国人写的两个类:https://gitorious.org/qserialdevice/qserialdevice/commits/2.0.这个是链接,右面有下载地址。里面的两个类分别是:qserialdevice和qserialdeviceenumerator,分别实现qt串口的操作和所有串口设备的显示,这个类看来是正中下怀啊。

4,于是开始研究学习这两个类,发现其自带的例子中,凡是gui的都不能使用,而console的倒可以顺利使用,用gui的都是提示ttylock这个类重复定义,翻来覆去找问题也没找到什么好的解决办法,网上也没哟什么好的解决办法,几近绝望要放弃这个类的时候,突然想到我怎么没查看该类的readme文件啊,于是有一种豁然开朗的感觉,查看该类的rendeme,由于是俄国人写的,其readme文件分为英文版本和俄文版本两个,俄文我是不懂了,英文还得拿着有道翻译,不过最后最算给翻译完了,原来可以编译成两个库文件,而且还是静态链接库,不过这就不错了,有的用就不要奢求什么了,于是有学习了一下qt的工程文件的编写规则,把这两个类的库文件导入工程,哦,对了,如果是linux还需要安装udev的类,其readme中有这个方面的说明。

5,还有一个问题,当我进到qserialdevice的包含类ttylocker时,该类明确说明是不能使用qmake进行编译的,需要使用cmake才可以,可是我现在编译成库文件了,稀里糊涂的竟然可以使用了,也没有什么cmake之类的东东啊,令人很茫然啊。

  最后,如果要使用这两个类,不要直接把这两个类的pri文件直接包含进来,这样会提示重复定义的错误,如果使用静态链接库的方式,是可以的,但为什么可以,我也不知道,如果你知道的话,希望你不吝赐教一下!

 

补充1:这两天电脑硬盘坏了,拿去检修,没过保修期,他们同意给我换一个新的,今天重新装上ubuntu11.04,qt creator4.7.2,再把原来的串口编程的软件重新打开,竟然编译不能通过,报告是:libudev.h:no such file or directory,可是我已经sudo apt-get install udev了,真是令人纠结,既然没有这个头文件,网上逛了一遍,发现这个源代码:http://code.google.com/p/libjingle/source/browse/trunk/talk/third_party/libudev/libudev.h?r=51    我把这段代码复制到一个新建的libudev.h的空白文件,然后再把这个文件:sudo cp libudev.h /usr/include/下,再重新编译,呵呵,过了,记录一下.

补充2:补充1仅仅是可以将该文件编译成静态链接库了,可是当我测试文档里的应用程序时提示:cannot find -ludev,这个问题是提示找不到libudev这个库文件,可是我已经sudo apt-get install udev了,最后使用sudo apt-get install libudev0 libudev-dev解决了该问题,估计不安装libudev-dev也可以通过,知道是没有这个库,但就不知到怎么解决,其实当时我sudo apt-get install libudev然后tab两下就可能看到libudev0这个库,问题就可以解决了,我估计libudev是libudev0的链接文件

Logo

更多推荐