PC软件与USB之间数据交换的过程.doc_第1页
PC软件与USB之间数据交换的过程.doc_第2页
PC软件与USB之间数据交换的过程.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PC软件与USB之间数据交换的过程 在与网友交流D12开发心得时,发现有些网友对与PC应用软件与单片机之间数据交换的过程有些困惑,不明白PC应用软件是怎么将数据发给单片机以及单片机是怎样通过D12将数据传给PC应用软件的。在此,谈谈个人对这一过程的理解,希望对大家有些帮助。 用户开发的USB设备一般不是windows开发的标准设备,而在VC软件中要对一个设备进行操作,必须先用CreateFile函数打开设备才能对其进行读写操作。当我们采用driverstudio开发驱动时,框架会产生一个OpenByInterface函数,它将CreateFile函数封装在了里面,其原型如下:HANDLE OpenByInterface( GUID* pClassGuid, / points to the GUID that identifies the interface classDWORD instance, / specifies which instance of the enumerated devices to open PDWORD pError / address of variable to receive error status )当我需要打开一个USB设备时只需要知道该设备的Guid就行了。这个所谓的Guid就是windows里面唯一标记硬件设备的标志,可由driverstudio自动产生,不需要人工干预。在打开设备以后,我们就可以调用读写函数对设备进行读写了。VC中与驱动交流的函数主要是DeviceIoControl函数。该函数定义如下:BOOL DeviceIoControl( HANDLE hDevice, / handle to device,设备句柄 DWORD dwIoControlCode, / operation,IOCTL操作码 LPVOID lpInBuffer, / input data buffer,输入数据缓冲/区 DWORD nInBufferSize, / size of input data buffer,输入/数据缓冲区大小 LPVOID lpOutBuffer, / output data buffer,输出数据缓冲/区DWORD nOutBufferSize, / size of output data buffer,输出/数据缓冲区大小 LPDWORD lpBytesReturned, / byte count,通讯字节计数 LPOVERLAPPED lpOverlapped / overlapped information,异步通讯/信息);参数中的dwIoControlCode对应着驱动中定义的IOCTL操作码。该操作码唯一定义了驱动的各项操作,比如读写端点1,读写端点2等。其他参数请参考msdn。利用上述函数,分别编写VC中读写各端点的函数。在本人提供的应用程序实例里定义了以下几个函数:DWORD CTestDevice:Endpoint1ReadPipes(UINT Length, void *pBuffer)DWORD CTestDevice:Endpoint1WritePipes(UINT Length, void *pBuffer)DWORD CTestDevice:ReadBulkPipes(UINT Length,void* pBuffer,DWORD* dwBytesTransferred)DWORD CTestDevice:WriteBulkPipes(UINT Length,void* pBuffer,DWORD* dwBytesTransferred) 在程序中,定义一个CTestDevice类,然后调用上面的函数即实现了对4个D12端点的同步读写操作。由于异步读写需要更深层次的驱动的知识,所以不做探讨。 当PC应用软件希望发送数据给单片机时,只需调用Endpoint1WritePipes或者WriteBulkPipes(针对不同端点,下同)函数,剩下的USB底层数据传送则交给了驱动与D12。当数据传送过来后,D12便触发中断,单片机在查询了中断寄存器后便知道PC通过哪个端点发送数据过来,随后读出该端点缓冲区的数据,进行操作。 当单片机需要发送数据给PC应用软件时,只要调用D12_WriteEndpoint函数即可将数据通过D12传送到PC端。那么PC应用软件怎么知道数据已经过来了呢?在同步数据读写方式下,PC应用软件一般采用查询的方式。大家可以看到DeviceIoControl函数中定义了输出缓冲区和输入缓冲区。PC应用软件在得到单片机发送过来的数据前,一直查询输入缓冲区的数据有没变化。一旦数据有变化,表明单片机已经发送数据过来,然后读出缓冲区的数据进行操作。当然这有个很大的缺点,就是PC应用软件进行查询时,就不能再做别的事情了,线程被阻塞。这个可以通过多线程的方式解决。 当采用异步读写的时候,就可以避

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论