关于读取USB设备数据问题!

meiloucheng 2010-09-13 07:41:58
求高手们看看问题,问题是我要如何才能发达指定长度的数据到usb设备,然后再读到usb设备里的信息返回,下面是我的发送串要求!
PC send: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
USB return: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

这是我的test.cpp文件代码

#include <iostream>
#include "stdio.h"
#include "windows.h"
#include "SiUSBXp.h"

using namespace std;
typedef SI_STATUS (*GetNumDevices)(LPDWORD); //获取USP设置数

typedef SI_STATUS (*GetProductString)(DWORD, LPVOID, DWORD); //获取描述

typedef SI_STATUS (*Open)(DWORD,HANDLE*);

typedef SI_STATUS (*Read)(HANDLE,LPVOID,DWORD,LPDWORD);

typedef SI_STATUS (*SetTimeouts)(DWORD,DWORD);

typedef SI_STATUS (*Write)(HANDLE,LPVOID,DWORD,LPDWORD);


int main() {
HINSTANCE hinstance = LoadLibrary("SiUSBXp.dll"); //加载
if (hinstance == NULL) {
cout << "SiUSBXp.dll加载失败!" << endl;
return 0;
}

GetNumDevices getNumDevices = (GetNumDevices) GetProcAddress(hinstance,"SI_GetNumDevices");

if (getNumDevices == NULL) {
cout << "SI_GetNumDevices失败!" << endl;
return 0;
}

DWORD dwNumDevices = 0;//连接usb个数
SI_DEVICE_STRING devStr;

//cout << sizeof(devStr) << endl;

SI_STATUS status = getNumDevices(&dwNumDevices);
if(status==SI_DEVICE_NOT_FOUND)
{
cout << "没有找到连接的usb设备!" << endl;
return 0;
}

if (status == SI_SUCCESS) {
for (DWORD d = 0; d < dwNumDevices; d++) {
GetProductString getProductString =
(GetProductString) GetProcAddress(hinstance,"SI_GetProductString");
status = getProductString(d, devStr, SI_RETURN_SERIAL_NUMBER);
if (status == SI_SUCCESS) {
//cout << "设备序列号:" << devStr << endl;
//设置超时
SetTimeouts setTimeouts =(SetTimeouts) GetProcAddress(hinstance,"SI_SetTimeouts");
setTimeouts(2000,2000);
//cout <<status << endl;

HANDLE handle;
Open open =(Open) GetProcAddress(hinstance,"SI_Open");
status = open(d,&handle);
if (status == SI_SUCCESS)
{
//读取内容
Read read =(Read) GetProcAddress(hinstance,"SI_Read");
Write write =(Write) GetProcAddress(hinstance,"SI_Write");

char lpBuffer[4096];
//lpBuffer[0]='a';
//lpBuffer[1]='a';
//lpBuffer[2]='a';
//lpBuffer[3]='a';

//cout <<lpBuffer<< endl;

DWORD dwBytesToRead=32;
//DWORD dwBytesReturned[4096];
DWORD dwBytesReturned=0;


SI_STATUS status2 = read(handle, lpBuffer, dwBytesToRead, &dwBytesReturned);
cout <<status2<< endl;
//cout <<dwBytesReturned<< endl;
cout <<lpBuffer[0]<< endl;
}
//cout <<0x0d << endl;
}
}
}

FreeLibrary(hinstance);
return 0;
}



SiUSBXp.h

#ifdef SI_USB_XP_EXPORTS
#define SI_USB_XP_API __declspec(dllexport)
#else
#define SI_USB_XP_API __declspec(dllimport)
#endif

// GetProductString() function flags
#define SI_RETURN_SERIAL_NUMBER 0x00
#define SI_RETURN_DESCRIPTION 0x01

// Return codes
#define SI_SUCCESS 0x00
#define SI_DEVICE_NOT_FOUND 0xFF
#define SI_INVALID_HANDLE 0x01
#define SI_READ_ERROR 0x02
#define SI_RX_QUEUE_NOT_READY 0x03
#define SI_WRITE_ERROR 0x04
#define SI_RESET_ERROR 0x05
#define SI_INVALID_PARAMETER 0x06
#define SI_INVALID_REQUEST_LENGTH 0x07
#define SI_DEVICE_IO_FAILED 0x08
#define SI_INVALID_BAUDRATE 0x09
// RX Queue status flags
#define SI_RX_NO_OVERRUN 0x00
#define SI_RX_OVERRUN 0x01
#define SI_RX_READY 0x02

// Buffer size limits
#define SI_MAX_DEVICE_STRLEN 256
#define SI_MAX_READ_SIZE 4096*16
#define SI_MAX_WRITE_SIZE 4096

// Type definitions
typedef int SI_STATUS;
typedef char SI_DEVICE_STRING[SI_MAX_DEVICE_STRLEN];

// Input and Output pin Characteristics
#define SI_HELD_INACTIVE 0x00
#define SI_HELD_ACTIVE 0x01
#define SI_FIRMWARE_CONTROLLED 0x02
#define SI_RECEIVE_FLOW_CONTROL 0x02
#define SI_TRANSMIT_ACTIVE_SIGNAL 0x03

#define SI_STATUS_INPUT 0x00
#define SI_HANDSHAKE_LINE 0x01 // 01







#ifdef __cplusplus
extern "C" {
#endif

SI_USB_XP_API
SI_STATUS WINAPI SI_GetNumDevices(
LPDWORD lpdwNumDevices
);

SI_USB_XP_API
SI_STATUS WINAPI SI_GetProductString(
DWORD dwDeviceNum,
LPVOID lpvDeviceString,
DWORD dwFlags
);

SI_USB_XP_API
SI_STATUS WINAPI SI_Open(
DWORD dwDevice,
HANDLE* cyHandle
);

SI_USB_XP_API
SI_STATUS WINAPI SI_Close(
HANDLE cyHandle
);

SI_USB_XP_API
SI_STATUS WINAPI SI_Read(
HANDLE cyHandle,
LPVOID lpBuffer,
DWORD dwBytesToRead,
LPDWORD lpdwBytesReturned
);

SI_USB_XP_API
SI_STATUS WINAPI SI_Write(
HANDLE cyHandle,
LPVOID lpBuffer,
DWORD dwBytesToWrite,
LPDWORD lpdwBytesWritten
);

SI_USB_XP_API
SI_STATUS WINAPI SI_DeviceIOControl(
HANDLE cyHandle,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD dwBytesToRead,
LPVOID lpOutBuffer,
DWORD dwBytesToWrite,
LPDWORD lpdwBytesSucceeded
);

SI_USB_XP_API
SI_STATUS WINAPI SI_FlushBuffers(
HANDLE cyHandle,
BYTE FlushTransmit,
BYTE FlushReceive
);

SI_USB_XP_API
SI_STATUS WINAPI SI_SetTimeouts(
DWORD dwReadTimeout,
DWORD dwWriteTimeout
);

SI_USB_XP_API
SI_STATUS WINAPI SI_GetTimeouts(
LPDWORD lpdwReadTimeout,
LPDWORD lpdwWriteTimeout
);

SI_USB_XP_API
SI_STATUS WINAPI SI_CheckRXQueue(
HANDLE cyHandle,
LPDWORD lpdwNumBytesInQueue,
LPDWORD lpdwQueueStatus
);

SI_USB_XP_API
SI_STATUS WINAPI SI_SetBaudRate(
HANDLE cyHandle,
DWORD dwBaudRate
);

SI_USB_XP_API
SI_STATUS WINAPI SI_SetBaudDivisor(
HANDLE cyHandle,
WORD wBaudDivisor
);

SI_USB_XP_API
SI_STATUS WINAPI SI_SetLineControl(
HANDLE cyHandle,
WORD wLineControl
);

SI_USB_XP_API
SI_STATUS WINAPI SI_SetFlowControl(
HANDLE cyHandle,
BYTE bCTS_MaskCode,
BYTE bRTS_MaskCode,
BYTE bDTR_MaskCode,
BYTE bDSR_MaskCode,
BYTE bDCD_MaskCode,
BOOL bFlowXonXoff
);

SI_USB_XP_API
SI_STATUS WINAPI SI_GetModemStatus (
HANDLE cyHandle,
PBYTE ModemStatus
);


#ifdef __cplusplus
}
#endif

...全文
226 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
djyrsty 2010-09-16
  • 打赏
  • 举报
回复
楼主打开设备后应该根据你USB设备的通讯协议进行收发数据,是先写什么再读还是一直读,按你上面所说的先写再读来操作就行啦
if (status == SI_SUCCESS)
{
//读取内容
Read read =(Read) GetProcAddress(hinstance,"SI_Read");
Write write =(Write) GetProcAddress(hinstance,"SI_Write");

char send[32],recv[100];
memset(recv, 0, 100);
memset(send, 0, 32);
DWORD dwByteWrite = 32;
DWORD dwBytesReturned = 0;
DWORD dwBytesToRead=32;
SI_STATUS status2 = write(handle, send, dwByteWrite , dwBytesReturned);
if(status2 == SI_SUCCESS)
{
SI_STATUS statusRead = 1;
dwBytesReturned=0;
while(!status2)
status2 = read(handle, recv, dwBytesToRead, &dwBytesReturned);
}
}
myeven 2010-09-14
  • 打赏
  • 举报
回复
在驱动板块发帖

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧