USB虚拟串口的通信
……………………………………………’……………
实用第一智慧密集
....,..........,
.|叠
U’沿蓥拟串口j的通信鬻
鬈
誊_巷?毒
一ll鹭夏j艮ll.
摘要本文实现基于CDC类的USB虚拟串口通信方式,不但省去了开发人员开发
USB
驱动的麻烦,更重要的是为主机设备与便携式设备通信提供了一种更好的解决
方法,在实际的应用中,有很好的借鉴和应用价值.
关键词At91sam7s256,USB,CDC
异步串行通信接口往往作为
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
外设出现在单片机和嵌入
式系统中.但是随着个人计算机通用外围设备越来越少地使用
串口,串口正在逐渐从个人计算机特别是便携式电脑上消失.
于是嵌入式开发人员常常发现自己新买来的计算机上没有串
口,或者出现调试现场用户的计算机没有串口的尴尬局面.本
文所要实现的USBCDC类,当用户将设备通过USB口连接到
个人计算机后,在操作系统中
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
现为一个串口设备,这意味着
USB接口对于传统的串口调试工具和用户基于串口的应用程序
是透明的,开发人员完全不用更改PC端的调试和应用程序.
一
,USB接口
通用串行总线fUniversalSerialBusUSB)是一种快速,灵活
的总线接口.与其它通信接口比较,USB接口的最大特点是易
于使用,这也是USB的主要
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
目标.作为一种高速总线接
口,USB适用于多种设备,如数码相机,MP3播放机,高速数
据采集设备等.易于使用还表现在USB接口支持热插拔,并
且所有的配置过程都由系统自动完成,无需用户干预.USB接
口支持1.5Mb/s(低速),12Mb/s(全速)和高达480Mb/s(USB
2.0规范)的数据传输速率,扣除用于总线状态,控制和错误
监测等的数据传输,USB的最大理论传输速率仍达1.2Mb/s
或9.6Mb/s,远高于一般的串行总线接口.
USB提供了四种传输方式:控制传输,同步传输,中断传
输和批传输.它们在数据格式,传输方向,数据包容量限制以
及总线访问限制等方面有着各自不同的特征.
1.控制传输(ControlTransfer)
(1)通常用于配置,命令,状态等情形.
(2)其中的设置操作(setup)和状态操作(status)的数
据包具有USB定义的结构,因此控制传输只能通过消息管道
进行.
(3)支持双向传输.
(4)对与高速设备,允许数据包最大容量为8B,16B,
与
32B或64B,对于低速设备只有8B一种选择.
(5)端点不能指定总线访问的频率和占用总线的时间,
USB系统软件会做出限制.
(6)具有数据传输保证,在必要时可以重试.
2同步传输(IsochronousTransfer)
(1)是一种周期的,连续的传输方式,通常用于与时间有
密切关系的信息的传输.
(2)数据没有USB定义的结构(数据流管道).
(3)单向传输,如果一个外设需要双向传输,则必须使用
另一个端点.
(4)只能用于高速设备,数据包的最大容量可以从0到
1023个字节.
(5)具有带宽保证,并且保持数据传输的速率恒定(每个
同步管道每帧传输一个数据包).
(6)没有数据重发机制,要求具有一定的容错性.
(7)与中断方式一起,占用总线的时间不得超过一帧的
9O%.
3.中断传输(InterruptTransfer)
(1)用于非周期的,自然发生的,数据量很小的信息的传
输,如键盘,鼠标等.
(2)数据没有USB定义的结构(数据流管道).
(3)只有输人这一种传输方式(即外设到主机).
(4)对于高速设备,允许数据包最大容量为小于或等于64
字节,对于低速设备只能小于或等于8字节.
(5)具有最大服务周期保证,即在规定时间内保证有一次
数据传输.
(6)与同步方式一起,占用总线的时间不得超过一帧的
9O%.
(7)具有数据传输保证,在不要时可以重试.
4.批传输(BulkTransfer)
(1)用于大量的,对时间没有要求的数据传输.
(2)数据没有USB定义的结构(数据流管道).
(3)单向传输,如果一个外设需要双向传输,则必须使用
另一个端点.
(4)只能用于高速设备,允许数据包最大容量为8,l6,
32或64字节.
(5)没有带宽的要求,只要有总线空闲,就允许传输数据
(优先级小于控制传输).
(6)具有数据传输保证,在必要时可以重试,以保证数据
的准确性.
以下将要介绍的CDC是基于第一种方式实现,同时,基
于CDC类实现的USB虚拟串口的通信方式实现方法.
二,硬件连接
USB接口的硬件连接原理图如图l所示,读者在参考时,
只需按图l中所示连接即可.其中有几点需要说明以下,以便
读者理解.
图1USB连接原理图
(1)XS2扁平座上的4个与USB有关的信号,在图l中
给出:VBUS向外提供+5V电源,DGND是地线,DDP
(D+)和DDM(D一)是差分数据线对.这4个信号是对外
的接口,而此扁平座除了USB信号线接口,还包括了其他信
号接口如:JTAG调试,RS232等.为此,笔者为读者提供了
一
种简便的调试方法:读者可以找一根USB线,将B型插头
端拆开,将看到红(VBUS),自(D一),绿(D+),黑
(GND)4条线,将这4条线分别一一对应与XS2上的4个信
号线相连接,并将A型插头插到PC端A型插座即可.当然,
读者也可以在实际的应用中,将上面提到的XS2上的相关USB
信号线做成标准的B型插座.
(2)在图l中,我们可以看到DDP(D+)信号线上连
接了1.5K的上拉电阻,在ATMEL的参考原理图上,其是连
接在一I/O口上,通过配置I/O口来控制的.而通过笔者实
践,直接将其连接到3.3V上也是可行的.其主要作用是为
PNP信号识别.
三,软件实现
首先我们先看CDC类的设备描述符,详细的描述读者可
以参看USB协议规范,在此笔者直接给出其描述文件,并做
简要的说明.
‘
con氅Descnp删】-{一./$设备描述?/
0x12,f/长葭.j
0x01,//挂遵攀澄一?
Q/bc,dUSBL,
OxO.
OxO2,//CDCo
~
OxO0,//CDC=}类
OxO0,,CDC设备协,议
Ox08,//包最大字节数
OxEB,//idVendorL
Ox03,//
0x24,//厂商代码低位
0x61薏
Oxl0
OxO
OxO0,
Ox
IOxO0,
OxO1
l:
在此设备描述符里,需要注意厂商代码,因为在USB设
备枚举时,需要根据此来选择适合设备自身的驱动程序,读者
不必担心,此驱动Atmel公司已经提供,后面将会介绍.
USB设备的初始化函数,主要设置USB设备需要的时
钟,CDC结构初始化等工作.
voidAT91F~SB_Opentvoid
--
{
AT91C_BASE_CKGR.》CKGR_PLLRl=参
AT9~C_CKGR_USBDIV_I
//使能,18MH.zUSBUDPCK~系统外部usB时钟
AT91.C_BASE~McPMC.:.SCER=AT91C_PMC_UDP;
AT9iC_BASE~MC一—》PMCJ:~3ER=
《1《<AT91CJD~DP):
//eDC结构初始化
…………………………………………………………
实用第一智慧密集
,….
r91DCpen(&pCDC.AT91C_BASE_UDP):
)
USB读函数主要完成从PC端接受数据工作.与其相对应
的写函数笔者在此不再赘述,完整的
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
代码可以向笔者索
取.
staticuintAT91FjJDf—Read(A_r91PS_CDCpCdc,char?pDa—
ta,uintlength)
f
...
//变量及结构体声明
while(1ength)
{
_f(IAT91F_uDPJsConfigured(pCdc))
break;
AT91F_PIO_』:learOutput(AT91C_BASE_PIOA,2):
_f(pUdp一>UDPCSR【AT91C—
EP—OUT】¤tRe—
ceiveBank)
{
packetSize=MIN(pUdp一>UDP_CSR【AT91C_EP_OUT1
>>16,length):
length?—=packetSize;
_f(packetSize<AT91C_EP_OUT_SIZE)
length=0:
while(packetSize一一)
pDataInbBytesRcv++】=pUdp一>
UDP_』=DR【AT91C_j三PUT】:
pUdp一>UDPSR【AT91C.EP_OUT】&:,
(currentReceiveBank):
_f(currentRecejveBank==A_r91CDPj×l_)ATABKO)
currentReceiveBank=AT91CUDP_
RX_DATABK1:
else
currentReceiveBank=
,C_UDPRXDKO;
)
AT91F_j)IO_SetOutput(AT91C_BASE_PIOA,2):
)
pCdc一>currentRcvBank=currentReceiveBank:
returnnbBytesRcv;
)
在主函数里主要完成USB设备的枚举,数据的收发等工
作.在实现主函数时,读者需要注意的是:调试时无法在程序
中设置断点,主要因为USB设备的枚举是个连续的过程,读
者可以借助USB调试助手之类的工具来完成调试工作.主函
数的实现代码如下:
intmain(void)
{
...
//变量声明
AT91C_
BASE_RSTC一>RSTC_RMR=A]_91C_RSTCRSTEN
l(Ox4<<8)l(unsignedint)(OxA5<<24):
//初始化USB设备
AT91FSB—ppen():
与
//等待USB枚举结束
while(!pCDC.IsConfigured(&pCDC)):
while(1)
{
lenIgth=pCDC.Read(&pCDC,data,MSG_SIZE):
_f(fir==0)
{
pCDCWrite(&pCDC.data,length);
fir:1:
)
else
{
pCDC:Write(&pCDC,datalength):
fir=0:
)
)
)
经过上面的步骤后,全速运行工程,并将USB连接线的A
),至于B型端接口,读者 型插头,插入主机(通常为PC机
可以在板子上gCI/~.卡
?C-SCSI和RAID控制器
I处理器
重蔫一磁盘驱动器
&4基电池
g懈调器
薯bgereSystems97Modem
囊-l 豫?_?_H_j_a目,_日__口_jI?啊
端n(COU和T)
$角红外线设备
露鋈计篡机
銎监视器
建盘
誊盛i人体学输入设备
$管较盘控$器
再强声音,视频和游戏控制器
霹)鼠标和其它指针设备
图2USB虚拟串口
在图2中,我们看到在硬件设备管理中的调制解调器设备
中多了一个设备,即:”ATMELAT91USBserialemulation”,
当然读者在实现过程中,可以修改atm6124ser.inf中的信息,
以便更符合自己的应用需求.修改方法:在atm6124ser.inf文
件中,找到下面的描述,修改成自己想定义的提示字符即可.
……-
COM帅RPROG跗嘲MiNGMAi胁眦_啵
t……………………………………………………………………
_|:.|l摹l曩l1lll?一j*蘩?
使用ZLiB开发的wI卿文件理器鼍l1麓鼍.毫
l?江淡”|
摘要对ZIP文件结构进行了深入分析,并且在合理使用ZLIB的基础上,开发成功
了
Windows系统下的ZIP文件管理器,可以对ZIP文件进行压缩,解压,删除和查
看操作.
关键词ZLIB,WINZIP,压缩,解压
ZIP文件是一种很常见的压缩文件格式,用户在Windows
下经常要使用WINZIP程序进行文件压缩和解压操作.不过,
WINZIP程序只能由用户操作,而没有提供开发方面的接口.
这样,要想在用户的应用程序中加入文件压缩和解压功能,就
有一定困难了.幸好有ZLIB这个开放源代码的压缩和解压库
可供开发人员使用.不过,ZLIB虽然支持文件压缩和解压,
但只能对Linux/Unix下的GZ文件进行读写操作,对于Win—
dows系统下的ZIP文件并不提供直接的支持.要解决ZLIB不
文件的矛盾,就需要对Windows下 能直接操作WindowsZIP
ZIP文件结构进行分析,再结合ZLIB所提供的相关函数,加
上一些开发技巧,自行开发相应的WINZIP程序.
一
,ZIP文件结构
ZIP文件基本结构如下:
{分文件头信息+文件压缩数据}+中心目录+中心目录记
录结束符
1.分文件头信息结构如表1所示.
2.中心目录结构如表2所示.
3.中心目录
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
结束符结构如表3所示.
更详细的说明如下:
每个分文件头信息后面紧跟此文件压缩数据.如果压缩
表1分文件头信息
字节数描述
4分文件头信息标志(值为504b03饼)
2解压缩所需版本(通常设为ml4)
2通用标志位(本程序中该字段值设为0)
2压缩方式(本程序只使用两种:0一不压缩;8一de压缩)
2文件最后修改时是经过
deflate算法压缩过的字节流.
ZIP文件中通常有若干个分文件数据,最多可达到65536
个.
文件的最后修改时间和日期按MS—DOS时间日期格式编
【Strings}
Mfg=ATMELCORPORATION
A.r91MSG=ATMELAT91US8serialemulation
USBFilterString=AT91USBserialemulation
通过上面的介绍,我们已经完成了USB虚拟串口的工
作.下面简单描述测试方法:
在确定硬件连接无误后,并在程序中设置两标志位,即发
数据前后各设一个标志位,程序运行后,通过串口调试助手软
发送1024Bytes(1KBytes)数据,并借助示波器观察 件,一次
两标志位状态变化时间,经过笔者测试,其数据传输率约为
1KBytes/ms,即与USB的全速状态下的数据传输率(8Mbits/s)
相吻合.
四,结语
至此,在AT91SAM7S256上通过CDC类实现USB虚拟串
口的功能就介绍完毕,并经过笔者测试,文中所实现的USB
虚拟串口的方法在实际的应用中是稳定,可行的.
(收稿日期:2008年6月16日)