新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 基于Qt实现USB CDC便携式设备串口通信客户端设计

基于Qt实现USB CDC便携式设备串口通信客户端设计

作者:张熹 时间:2015-05-14 来源:电子产品世界 收藏
编者按:为实现上位机Linux系统的Qt应用程序与下位机USB CDC便携式设备之间的串口通信,本课题采用USB CDC类协议,并根据协议在Linux下编写设备驱动程序,同时,搭建Linux-QT应用平台利用QT可视化的图形界面及丰富的图形库,设计并制作上位机应用程序图形界面,并根据Linux下串口通信的应用层协议,最终实现了在QT界面上实时显示便携式设备的数据、状态和控制便携式设备。该方法简单、可靠、便于实际工程应用,解决了安装有Linux操作系统的上位机用户与便携式设备通信不方便的问题。因此,本课题对USB

2.2 界面设计

本文引用地址://www.cghlg.com/article/273269.htm

  界面设计是基于C++语言开发的,类似于Windows下VC++的MFC开发,而的界面都是功能模块化的,开发起来更加简洁和方便。本课题中设计的QT界面,是通过QT界面设计向导搭建界面框架来完成的,界面框架MainWindow被分为四个部分:centralWidget、menuBar、mainToolBar和statusBar,添加需要的元件组件和信息内容到各个部分,之后编写元件之间的逻辑程序和调用通信接口函数。另外,在设计过程中使用到了类QMainWindow、类QDialog和类QFrame,这三个类是QT界面开发过程中最常用的,它们全部继承自QWidget[6] ,如图3所示。

3 QT的实现

3.1 的原理

  因为在QT中没有提供串口控制类,所以需要使用一个由第三方提供的QextSerialPort类来实现。由于QextSerialPort类提供了两个子类:QextSerialBase类和Posix_QextSerialPort类,分别用于Windows平台和平台运行。这里在下使用Posix_QextSerialPort类,该类关系图如图3所示。

  可以看到,QextSerialPort类继承自 QT 软件自带的QIODevice类,所以该类中的一些函数可以直接调用。其中,Posix_QextSerialPort继承自QextSerialBase,Posix_QextSerialPort类添加了Linux平台下操作串口的一些功能。在QextSerialBase类中涉及到一个枚举变量QueryMode,QueryMode指的是读取串口的方式,它提供两个值:查询方式Polling和事件驱动方式EventDriven[7] 。其中,事件驱动方式EventDriven利用事件处理串口的读取,一旦有数据到来,就会发出readyRead信号,这样可以关联该信号来读取串口的数据。在此方式下,串口的读写是异步的,调用读写函数会立即返回,就不会冻结调用线程。而查询方式Polling则不同,读写函数是同步执行的,信号在这种模式下无法工作,而且有些操作也无法实现,然而这种模式下的开销较小。这样就需要建立定时器来读取串口的数据。本文介绍的就是用Polling方式来进行串口通信,因为linux下串口通信仅支持此种模式。

3.2 Polling方式串口通信的实现过程

  由于Polling方式进行串口通信需要设置一个内部定时器,通过QT自有的信号与槽机制,将定时器超时信号与触发函数关联,每到定时器设定的时间后,串口就读取一次数据或者发送一次用户数据,这里以读操作为例进行说明,关键代码及注释如下:

  #define TIME_OUT 10 //TIME_OUT是串口读延时

  #define TIMER_INTERVAL 200 //读取串口缓存的延时200ms

  void MainWindow::startInit() //初始化

  { …

  timerdly = TIMER_INTERVAL; //初始化读取定时器间隔

  timer = new QTimer(this); //设置读取计时器

  connect(timer, SIGNAL(timeout()), this, SLOT(readMyCom())); //信号和槽函数关联,延时10ms,进行读串口操作

  }

  void MainWindow::on_Open_triggered() //打开串口

  { …

  myCom = new Posix_QextSerialPort(“/dev/ACM0″, QextSerialBase::Polling); //这里采用Polling方式,设备为类下的ACM0

  timer->start(timerdly); //开启读取定时器

  myCom->setTimeout(TIME_OUT); //设置延时

  }

  具体串口通信的流程图如图4所示。

3.3 QT串口通信在Linux下的实现

  在熟知QT下串口通信的原理后,在QT软件中建立工程,通过调用QextSerialBase和Posix_QextSerialPort两个类,利用Textbrowser、Label和Button等元件函数来实现QT界面的编写,在PC机上调试Debug版本,调试成功后,可以发布Release版本,运行效果如图5、6所示。至此,上位机Linux系统的图形界面就设计完成了,也可根据自己的需要和使用习惯来设计图形用户界面,以达到最大的美观效果和便捷性。


4 结语

  文章介绍了实现USB 类设备通信实现和制作QT串口通信界面的方法。该方法简单,可靠,易学,并且成本低廉。同时,本驱动软件在Linux 2.6内核版本下通过了专业的测试和验证,并应用到公达数码的POS58和POS80等型号的打印机产品中,该公司使用本驱动软件的打印机产品已广泛地应用在餐饮行业及其他领域。另一方面,由于Linux系统和QT软件均具有较强的可移植性,可以将本界面程序移植到手持设备端,这样将会有更加广阔的市场前景。

参考文献:

  [1]李英伟,王成儒,练秋生,等.USB2.0原理与工程开发(第二版)[M].北京:国防工业出版社,2007

  [2]张弘.USB接口设计[M].西安:西安电子科技大学出版社,2002

  [3]郝莹,孙宏军.基于协议的仪表通用USB接口设计[C]. 第25届中国控制与决策会议论文集,2013.05

  [4]吴明琪,马潮.嵌入式系统的USB虚拟串口设计[J].单片机与嵌入式系统应用,2005.(04):62-63+66

  [5]www.usb.org,USB Class Definitions for Communication Devices[J], Revision 1.2 2007

  [6]霍亚飞.QT Creator 快速入门[M].北京:北京航空航天大学出版社,2012

  [7]刘依晗,丑武胜,董明杰.基于QT/E串口通信的手持监控器[M].现代电子技术,2013,36(20):110-112

  [8]霍亚飞.Qt及Qt Quick开发实战精解[M].北京:北京航空航天大学出版社,2012

  [9]温卡特斯瓦兰 著,宋宝华 等译.精通Linux设备驱动程序开发[M].北京:人民邮电出版社,2010

  [10]Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini. Linux Device Drivers[J], 3rd Edition.O'Reilly,2005.02

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程


c++相关文章:c++教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭