MPUSBAPI--USB上位机驱动库函数简介
来源:互联网 发布:红外网络摄像机怎么用 编辑:程序博客网 时间:2024/04/27 11:03
来源:http://www.garcia-cuervo.net/picmania.garcia-cuervo.net/USB_MPUSBAPI_DLL.php
译者按:
最近从事硬件驱动方面的研究,正在学习写一个电机驱动的程序,接触到一些上位机、USB驱动方面的知识。在网上的资料中,对于USB上位机的驱动程序,用得比较多的是Microchip公司的PIC18F4550芯片的驱动库mpusbapi.dll。
MPUSBAPI链接库
MPUSBAPI库是一个适用于PIC
定义
有以下几种定义标记:
MPUSB_FAIL = 0
MPUSB_SUCCESS = 1
MP_WRITE = 0
MP_READ = 1
MAX_NUM_MPUSB_DEV = 127
函数
以下的信息是从本人电脑的文件中原封不动的摘取的:
C:/MCPFSUSB/Pc/Mpusbapi/Dll/Borland_C/Source/_mpusbapi.cpp
下载地址:
http://www.hep.princeton.edu/~tziegler/electronics/microchip/_mpusbapi.cpp
1. DWORD *MPUSBGetDLLVersion(void)
该函数获取MPUSBAPI.DLL的版本信息。这是一个32位的级别为MMMMmmmm的修正版本。该函数只返回软件代码的版本,对驱动程序并无多大意义。
2. DWORD *MPUSBGetDeviceCount(PCHAR pVID_PID )
该函数返回版本号(Version ID)和产品号(Product ID)相匹配的设备号码。输入PCHAR类型的变量Pvid_PID。
3. HANDLE *MPUSBOpen(instance, pVID_PID, pEP, dwDir, dwReserved )
该函数返回版本号与产品号相匹配的终点管道(endpoint pipe)的句柄。所有管道都具有FILE_FLAG_OVERLAPPED属性。这样的设置将使得函数MPUSBRead、MPUSBWrite和MPUSBReadInt函数具有一个暂停值。
注:暂停值对于同步管道而言,没有任何意义。
输入参数见下表:
DWORD instance | 输入 | 要打开的设备的实例号,更多的细节参见_mpusbapi.cpp |
PCHAR Pvid_PID | 输入 | 包含有目标设备的PID及VID的字符串。其格式为“vid_xxxx&pid_yyyy”,其中xxxx是VID的十六进制的值,yyyy是PID的十六进制的值。 |
PCHAR pEP | 输入 | 对于要打开的终端目标的终端号号码。格式为//MCHP_EPz,其中z是十进制的终端号码。例如“//MCHP_EP1” |
DWORD | 列表 | 指明终端的路径,用MP_READ代替MPUSBRead和MPUSBReadInt,用MP_WRITE代替MPUSBWrite。 |
DWORD | 保留字节 |
4. DWORD *MPUSBRead(handle, pData, dwLen, pLength, dwMilliseconds )
该函数的参数如下表所示:
HANDLE handle | 输入 | 识别将要读取的终端管道,管道句柄必须具有MP_READ的属性 |
PVOID pData | 输出 | 指向接收管道数据缓冲区的指针 |
DWORD dwLen | 输入 | 指定从管道中读入的字节的长度 |
PDWORD pLenght | 输出 | 指向字节长度的指针,在进行错误检查之前,MPUSBread函数将该值赋为0。 |
DWORD dwMilliseconds | 输入 | 指定暂停间隔,单位为毫秒。如果间隔过去,即使是操作不完整,该函数也有返回值,如果参数dwMilliseconds是无限的,那么暂停间隔将永不消失。 |
5. DWORD *MPUSBWrite(handle, pData, dwLen, pLength, dwMilliseconds )
HANDLE handle | 输入 | 识别将要写入的终端管道。管道句柄必须具有MP_WRITE的属性。 |
PVOID pData | 输入 | 指向写入管道数据缓冲区的指针 |
DWORD dwLen | 输入 | 指定写入管道数据的字节长度 |
PDWORD pLength | 输出 | 指向写入字节长度的指针。在进行错误检查之前,MPUSBWrite函数将该值设置为0 |
DWORD dwMilliseconds | 输入 | 指定暂停间隔,单位为毫秒。如果间隔过去,即使是操作不完整,该函数也有返回值,如果参数dwMilliseconds是无限的,那么暂停间隔将永不消失。 |
6. DWORD *MPUSBReadInt(handle, pData, dwLen, pLength, dwMilliseconds )
HANDLE handle | 输入 | 识别将要读入的终端管道。管道句柄必须具有MP_READ的属性。 |
PVOID pData | 输出 | 指向接收管道数据的缓冲区的指针。 |
DWORD dwLen | 输入 | 指定从管道中读取的字节长度。 |
PDWORD pLength | pLength | 指向读入字节的长度的指针。在进行错误检查之前,MPUSBRead函数将该值设置为0。 |
DWORD | dwMilliseconds | 指定暂停间隔,单位为毫秒。如果间隔过去,即使是操作不完整,该函数也有返回值,如果参数dwMilliseconds是无限的,那么暂停间隔将永不消失。 |
7. BOOL *MPUSBClose(handle)
关闭一个已经给出的句柄
转让类型用法的总结
转变类型 函数 是否能中止连接
中断输入(Interrupt-IN) MPUSBRead/MPUSBReadInt 是
中断输出(Interrupt-OUT) MPUSBWrite 是
批量输入(Bulk-IN) MPUSBRead 是
批量输出(Bulk-OUT) MPUSBWrite 是
同步输入(Isochronous-IN) MPUSBRead 是
同步输出(Isochronous-OUT) MPUSBWrite 是
以下内容非翻译:
实例
下面这段代码驱动电机的旋转:
DWORD selection = 0;
fflush(stdin);
myOutPipe = MPUSBOpen(selection,vid_pid,out_pipe,MP_WRITE,0);
myInPipe = MPUSBOpen(selection,vid_pid,out_pipe,MP_READ,0);
if(myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
{
printf("Failed to open data pipes./r/n");
return;
}//end if
UpdateData(TRUE);
BYTE send_buf[6],receive_buf[6];
memset(send_buf, 0, 6*sizeof(BYTE));
memset(receive_buf, 0, 6*sizeof(BYTE));
DWORD RecvLength=m_dwRecvLength;
#define READ_VERSION 0x33
send_buf[0] = 0x43; // Command
send_buf[1] = 0x01;
if (SendReceivePacket(send_buf,6,receive_buf,&RecvLength,1000,1000) == 1)
{
;
}
// Let's close the data pipes since we have nothing left to do..
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
myOutPipe = myInPipe = INVALID_HANDLE_VALUE;
UpdateData(FALSE);
下面这段代码使电机停止转动:
DWORD selection = 0;
fflush(stdin);
myOutPipe = MPUSBOpen(selection,vid_pid,out_pipe,MP_WRITE,0);
myInPipe = MPUSBOpen(selection,vid_pid,out_pipe,MP_READ,0);
if(myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
{
printf("Failed to open data pipes./r/n");
return;
}//end if
UpdateData(TRUE);
BYTE send_buf[6],receive_buf[6];
memset(send_buf, 0, 6*sizeof(BYTE));
memset(receive_buf, 0, 6*sizeof(BYTE));
DWORD RecvLength=m_dwRecvLength;
#define READ_VERSION 0x33
send_buf[0] = 0x34; // Command
send_buf[1] = 0x0;
if (SendReceivePacket(send_buf,6,receive_buf,&RecvLength,1000,1000) == 1)
{
;
}
// Let's close the data pipes since we have nothing left to do..
MPUSBClose(myOutPipe);
MPUSBClose(myInPipe);
myOutPipe = myInPipe = INVALID_HANDLE_VALUE;
UpdateData(FALSE);
- MPUSBAPI--USB上位机驱动库函数简介
- USB的上位机
- 上位机USB移植心得
- USB驱动之USB简介
- 上位机与USB设备通信
- STM32 USB 上位机程序实现
- 嵌入式USB上位机的制作
- STM32 USB 上位机程序实现
- 上位机与USB设备通信
- USB驱动开发(1)--简介
- 无驱动上位机软件开发途径
- 网络相机上位机软件驱动分析
- 上位机和下位机简介
- linux usb驱动 (usb简介 linux简介)
- USB/HID 上位机开发流程及注意事项-----/*自己编写*/
- 初涉USB,初学者USB入门总结(5)USB上位机读写开发
- 初涉USB,初学者USB入门总结(5)USB上位机读写开发
- 《WDF USB驱动开发指南》-- WDF简介
- Jboss4集群配置之五:Jboss集群session复制
- 【CT】SAP Business Connector介绍
- qt支持中文、国际化
- Windows Vista系统还原占内存解决方法
- --提取 字符函数
- MPUSBAPI--USB上位机驱动库函数简介
- skyeye
- J2EE集群原理(一)
- J2EE集群原理(二)
- System.exit(-1)和return 的区别
- Excel 数据导入到 Access、Sql Server 中示例代码
- Google T恤,公司里散发的文化气氛
- Vista下调整硬盘分区大小的方法
- welcome to shanghai massage