老古开发网首页
导航:老古开发网首页文章索引文章分类单片机→[PC与单片机USB(D12)数据通讯过程描述 (转)]
| -文章搜索 - 最新文章 - |

PC与单片机USB(D12)数据通讯过程描述 (转)

发布时间:2006年7月12日 点击次数:1971
来源:   作者:
 

在与网友交流D12开发心得时,发现有些网友对与PC应用软件与单片机之间数据交换的过程有些困惑,不明白PC应用软件是怎么将数据发给单片机以及单片机是怎样通过D12将数据传给PC应用软件的。在此,谈谈个人对这一过程的理解,希望对大家有些帮助。

用户开发的USB设备一般不是windows开发的标准设备,而在VC软件中要对一个设备进行操作,必须先用CreateFile函数打开设备才能对其进行读写操作。当我们采用driverstudio开发驱动时,框架会产生一个OpenByInterface函数,它将CreateFile函数封装在了里面,其原型如下:

HANDLE OpenByInterface(

              GUID* pClassGuid,       // points to the GUID that identifies the interface class

DWORD 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类,然后调用上面的函数即实现了对4D12端点的同步读写操作。由于异步读写需要更深层次的驱动的知识,所以不做探讨。

PC应用软件希望发送数据给单片机时,只需调用Endpoint1WritePipes或者WriteBulkPipes(针对不同端点,下同)函数,剩下的USB底层数据传送则交给了驱动与D12。当数据传送过来后,D12便触发中断,单片机在查询了中断寄存器后便知道PC通过哪个端点发送数据过来,随后读出该端点缓冲区的数据,进行操作。

当单片机需要发送数据给PC应用软件时,只要调用D12_WriteEndpoint函数即可将数据通过D12传送到PC端。那么PC应用软件怎么知道数据已经过来了呢?在同步数据读写方式下,PC应用软件一般采用查询的方式。大家可以看到DeviceIoControl函数中定义了输出缓冲区和输入缓冲区。PC应用软件在得到单片机发送过来的数据前,一直查询输入缓冲区的数据有没变化。一旦数据有变化,表明单片机已经发送数据过来,然后读出缓冲区的数据进行操作。当然这有个很大的缺点,就是PC应用软件进行查询时,就不能再做别的事情了,线程被阻塞。这个可以通过多线程的方式解决。

当采用异步读写的时候,就可以避免上面的问题,它类似与一种中断机制,即当数据传送过来时,驱动会发送一个IRP包通知应用程序。在这之前,应用程序完全可以处理别的事情,而不需要等待。当然这种方式是以增加驱动程序难度为代价的,对于初学者来说还是过于复杂了。


欢迎进入老古论坛进行讨论
[单片机] 相关文章:
[转载]单片机硬件系统设计原则
简介:
单片机硬件系统设计原则 资料整理:dunleavy 一个单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单元,如ROM、RAM、I/O、定时器/计数器、中断系统等不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统的配置,即按照系统功能要求配置外围设备,如键盘、显示器、打印机、A/D、D/A转换器等,要设计合适的接口电路。 系统的扩展和配置应遵循以下原则: 1、尽可能选择典型电路,并符合单片机常规用法。为硬件系统的标准化、模块化打下良好的基础。 2、系......

(转)XD5101实验三----按键计数(lcd显示)
RTX51的单片机软件设计
A51 2.2 CPU寄存器
A51 2.2.1 8051版的CPU寄存器
24C512程序
A51 2.2.2 英特尔/爱特梅尔WM251的CPU寄存器
(转)XD5101实验二----按键计数(led显示)
关于硬件设计的几点小窍门之系统效率
PCB设计规范系列之一(摘)
 
下一个:[接口电路]RS-232-C接口与RS-485接口
简介:
1、什么是RS-232-C接口?采用RS-232-C接口有何特点?传输电缆长度如何考虑?   计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。 在串行通讯时,要求通讯双方都采用一个标准接口,使不同 的设备可以方便地连接起来进行通讯。 RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及......
 

上一个:[接口电路][转载]基于USB2.0的高速同步数据采集系统设计

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:63毫秒