单位文秘网 2021-10-27 08:16:43 点击: 次
组织架构等特点。尤其是它配以拥有多种应用库的QT软件,使得本CDC类设备串口通信应用程序设计简单,成本低廉,非常适合于推广和应用。1USB和USB CDC协议
1.1 USB接口简介
通用串行总线(Universal SerialBus,简称USB)是计算机连接外部设备装置的一个高速串行通信协议标准,如今USB2.0已广泛地应用在计算机上,同时也扩展到了家用机顶盒和游戏机上。另外,补充标准On-The-Go(OTG)使USB设备间能够独立地进行数据交换。USB的出现大大简化了计算机和其它设备的数据通信,增强了计算机的扩展性,因而得到大范围推广。
通信接口是便携式设备必备的对外功能模块之一。由于现今设备的多功能特点,造成数据传送量呈几何级数地增加,过去的通信协议标准如串口通信协议RS-232、并行通信接口协议LPT等存在传输速度低、误码率高、数据常常丢失等问题,已不能满足社会发展的需求。可以看出,USB接口在便携式设备上出现是一种必然趋势。
1.2 CDC类简介
USB通讯协议组织制定了三个类:通信设备类、通信接口类和数据接口类。通讯设备类是一种设备级别的定义,主机用该协议识别外部设备可以表现出的不同接口类型。通信接口类定义了一种可以使能USB上的所有类型的通信服务的通用机制。数据接口类定义了一种通用机制,当数据不能满足其它通信类的要求时,能使USB完成块数据或者同步传输功能。其中,USB CDC类是由通信接口类和数据接口类组合而成。针对不同的USB通信设备,CDC类又被分成以下三个模式:传统纯电话业务模式、ISDN模式和网络模式。而传统纯电话业务模式可分为Direct Line ControlModel. ACM(Abstract ControlModel)和USBTelephone Model。本文所讨论的便携式设备串口通信就属于USB传统纯电话业务下的ACM模式。
1.3 CDC类协议通信原理和接口函数
USB CDC类协议所描述的USBCDC类设备首先像一般的USB设备被USB Core所识别和描述,其次将信息上传至更高层协议,也就是tty协议层,最后通过线路规程的方式,将tty协议层和usb协议层结合使用,完成CDC类设备通信,即tty协议层负责应用程序串口通信,usb协议层负责CDC类设备的识别、描述和通信,如图l所示。
本文中开发的设备驱动涉及的主要接口函数和过程如下:首先,当CDC类设备接入USB接口时,利用初始化函数acm_init (void)初始化设备,再由探针函数acm_probe()对接入的设备识别检测;其次,设备控制中断函数acm_ctrl_irq()发出中断,请求数据读写,其中数据读写函数为:批量块传输读函数acm—read—bulk()、批量块传输写函数acmwrite_bulk();再次,打开tty协议层设备,并进行数据通信,主要是以下五个函数:打开tty设备函数acmtty_open()、关闭函数acm_tty_close()、写函数acm_tty_write()、中断控制函数acm_tty_break_ctl()和IO控制函数acm_tty_ioctl();最后,需要有设备驱动的销毁和退出函数;acm_disconnect()、acm—exit(void)。
2 QT软件介绍及其界面设计
2.1 QT软件简介
Qt是1991年由奇趣科技开发的一个跨平台C++图形用户界面应用程序开发框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。因此,Qt的扩展性极强,允许多组件或模块化编程。同时,Qt的跨平台特性好,支持任何平台的编译与运行。另外,其独有的信号和槽机制,使得触发信号和数据在不同模块间通信。可以看出,QT是专门面向用户对象的,提供了图形用户界面的应用框架和窗口系统,具有极易的开发特性,非常适合于linux下应用程序的开发。QTDesigner实现界面设计如下。
2.2 QT界面设计
QT界面设计是基于C++语言开发的,类似于Windows下VC++的MFC开发,而QT的界面都是功能模块化的,开发起来更加简洁和方便。本课题中设计的QT界面,是通过QT界面设计向导搭建界面框架来完成的,界面框架MainWind ow被分为四个部分:centralWidget、menuBar、mainToolBar和statusBar,添加需要的元件组件和信息内容到各个部分,之后编写元件之间的逻辑程序和调用通信接口函数。另外,在设计过程中使用到了类QMainWindow、类QDialog和类QFrame,这三个类是QT界面开发过程中最常用的,它们全部继承自QWidget,如图3所示。
3 QT串口通信的实现
3.1 Linux下串口通信的原理
因为在QT中没有提供串口控制类,所以需要使用一个由第三方提供的QextSerialPort类来实现串口通信。由于QextSerialPort类提供了两个子类:QextSerialBase类和Po six_QextSerialPort类,分别用于Windows平台和Linux平台运行。这里在Linux下使用Posix_QextSerialPort类,该类关系图如图3所示。
可以看到,QextSerialPort类继承自QT软件自带的QIOD evice类,所以该类中的一些函数可以直接调用。其中,Posix_QextSerialPort继承自QextSerialBase, Posix_QextSerialPort类添加了Linux平台下操作串口的一些功能。在QextSerialBase类中涉及到一个枚举变量QueryMode,QueryMode指的是读取串口的方式,它提供两个值:查询方式Polling和事件驱动方式EventDriven[71。其中,事件驱动方式EventDriven利用事件处理串口的读取,一旦有数据到来,就会发出readyRead信号,这样可以关联该信号来读取串口的数据。在此方式下,串口的读写是异步的,调用读写函数会立即返回,就不会冻结调用线程。而查询方式Polling则不同,读写函数是同步执行的、信号在这种模式下无法工作,而且有些操作也无法实现,然而这种模式下的开销较小。这样就需要建立定时器来读取串口的数据。本文介绍的就是用Polling方式来进行串口通信,因为linux下串口通信仅支持此种模式。
3.2 Polling方式串口通信的实现过程
由于Polling方式进行串口通信需要设置一个内部定时器,通过QT自有的信号与槽机制,将定时器超时信号与触发函数关联,每到定时器设定的时间后,串口就读取一次数据或者发送一次用户数据,这里以读操作为例进行说明,关键代码及注释如下:
#define TIME_OUT10 //TIME_OUT是串口读延时
#define TIMER—INTERVAL 200//读取串口缓存的延时200ms
voidMainWindow::startlnit()//初始化
{…
timerdly= TIMER—INTERVAL,//初始化读取定时器间隔 timer= new QTimer(this),//设置读取计时器
connect(timer, SIGNAL(timeout(》,this, SLOT(readMyCom(》);//信号和槽函数关联,延时lOms,进行读串口操作
}
void MainWindow::on_Open_triggered()//打开串口
{…
myCom=new Posix—QextSerialPort(“/dev/ACMO”,QextSerialBase::Polling),//这里采用P olling方式,设备为CDC类下的ACMO
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 CDC类设备通信实现和制作QT串口通信界面的方法。该方法简单,可靠,易学,并且成本低廉。同时,本驱动软件在Linux 2.6内核版本下通过了专业的测试和验证,并应用到公达数码的POS58和POS80等型号的打印机产品中,该公司使用本驱动软件的打印机产品已广泛地应用在餐饮行业及其他领域。另一方面,由于Linux系统和QT软件均具有较强的可移植性,可以将本界面程序移植到手持设备端,这样将会有更加广阔的市场前景。
(责任编辑:单位文秘网) )地址:https://www.kgf8887.com/show-223-97188-1.html
版权声明:
本站由单位文秘网原创策划制作,欢迎订阅或转载,但请注明出处。违者必究。单位文秘网独家运营 版权所有 未经许可不得转载使用