1.USB虚拟串口代替物理串口的可行性编程
首先,愈来愈多带USB接口的器件涌现出来,如带USB接口的单片机,或独立的USB接口器件,并且这些器件的成本已经很接近于使用RS232电平转换芯片所带来的成本。网络
其次,市场上也出现了一些USB接口转串口的芯片,这些芯片一头为串口,另外一头为USB接口,在其内部完成串口到USB协议的转换。该芯片经过USB口链接到我的计算机后,在操做系统中表现为一个串口设备,这意味着USB接口对于传统的串口调试工具(HyperTerninal)和用户基于串口的应用程序是透明的,开发人员彻底不用更改PC端的调试和应用程序。异步
可是这些器件的USB类不属于标准的USB设备类,所以须要在Windows和Linux操做系统上安装额外的设备驱动。另外,因为不是操做系统自带的设备驱动,并且通讯通过了由串口到串口,USB从设备到USB主机的屡次转换,当调试遇到问题时经常没法肯定是串口出了问题仍是USB出了问题。所以,应该使嵌入式系统直接和PC经过USB总线接口链接(经过片上的USB接口或片外USB接口芯片),由单片机直接完成USB虚拟串口的协议转换。函数
在USB标准子类中,有一类称之为CDC类,能够实现虚拟串口通讯的协议,并且因为大部分的操做系统(Windows和Linux)都带有支持CDC类的设备驱动程序,能够自动识别CDC类的设备,这样不只免去了写专用设备驱动的负担,同时简化了设备驱动的安装。工具
2.什么是CDC类编码
USB的CDC类是USB通讯设备类(Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各类通讯设备(电信通讯设备和中速网络通讯设备)使用的USB子类。根据CDC类所针对通讯设备的不一样,CDC类又被分红如下不一样的模型:USB传统纯电话业务(POTS)模型,USB ISDN模型和USB网络模型。其中,USB传统纯电话业务模型,有可分为直接线控制模型(Direct Line Control Model)、抽象控制模型(Abstract Control Model)和USB电话模型(USB Telephone Model),如图1所示。本文所讨论的虚拟串口就属于USB传统纯电话业务模型下的抽象控制模型。
操作系统
3.AT89C5131的简单介绍设计
基于单片机的嵌入式系统要实现USB总线通讯,一般都是经过外扩专用的USB总线接口芯片(如飞利浦的D12)。可是这样的方案既增长了成本,又使PCB板的面积变大,因此使用Atmel公司的集成了USB2.0全速(Full Speed)从接口外设的51单片机AT89C5131。调试
AT89C5131是一个基于52内核的单片机。在存储器方面,其内部集成了32KB的Flash存储器用于代码的存储,1KB的EEPROM存储器用于用户数据的存储,用户可使用片上的Bootloader或Flash API经过USB接口或者其余接口(如UART和I2C总线)对Flash存储器和EEPROM存储器进行ISP或者IAP编程。 此外AT89C5131还集成了10位的ADC、I2C总线接口和PCA模块等丰富的外设。
接口
AT89C5131的USB2.0全速从接口包含了7个终端点,其中0号终端点被配置成为默认的控制终端点。其余1~6号终端点均可以经过特殊寄存器配置为控制(Control),突发(Bulk),中断(Interrupt)和周期性(Isochronous)模式。因为每个终端点都由一组独立的寄存器对该终端点进行控制、状态识别和数据的存取,则若是将这些寄存器直接映射到51单片机的特殊功能寄存器地址空间显然是容纳不下的。所以,这7个终端点的7组寄存器在单片机的地址空间中其实使用的是同一组寄存器的地址,而经过一个特殊功能寄存器(UEPNUM)来选择当前该组寄存器实际选择的是哪一个终端点的寄存器组,这样就大大节省了所占用的地址空间,为集成其余特殊外设提供了可能。
4.基于AT89C5131的CDC类的实现
AT89C5131与USB接口的硬件链接很简单,选用一个Btype的USB插座,由于按照USB规范,从设备使用Btype的USB插座,主设备使用Atype的USB插座,将Btype的USB插座的D+和D-脚分别与AT89C5131上的D+和D-脚相连。而后再在电源和D+之间用一个1.5 kΩ的上拉电阻链接,由于按照USB规范,USB主设备是经过从设备在插入时D+和D-上的绝对电平来肯定从设备是一个全速设备仍是一个低速设备的,而AT89C5131是一个全速设备,因此须要将D+上拉。
下面介绍虚拟串口的单片机软件设计与实现。首先来看一下终端点的分配,按照CDC类抽象控制模型对终端点的需求,将单片机0号终端点和1号终端点分配给通讯接口子类,分别做为控制终端点(完成枚举和串口参数设置)和中断终端点,而将2号和3号终端点分配给数据接口子类,分别做为IN和OUT终端点,虚拟串口的数据主要从这两终端点来进行传送。
软件使用Keil C51为编译系统,为了便于和系统的其余程序集成,采用标准字符型设备的API接口usb_getc()和usb_putc(),使程序具备很好的移植性。应用程序层函数(usb_getc()和usb_putc())与USB中断处理程序经过两个先进先出FIFO循环队列(TX和RX)来交换数据,这样有效的起到收发缓冲的做用,防止缓冲溢出。
5.总结
在单片机上实现基于CDC类的USB虚拟串口很好的适应了当前计算机外设接口的发展,同时由于这样的接口在PC操做系统中仍然映射为一个串口,因此又避免了大量的PC端调试程序和应用程序的从新编写。