![](https://csdnimg.cn/release/download_crawler_static/47918326/bg1.jpg)
linux 下 Qt 串口通信小结
2011-09-19 15:09
由于项目需要,实现在 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 文件直接包含进来,这样会提示重
复定义的错误,如果使用静态链接库的方式,是可以的,但为什么可以,我也不知道,如果
你知道的话,希望你不吝赐教一下!