我最近在阅读关于Arduino的Hello World应用程序的文章,我心里想,"我想知道我是否可以用我现在拥有的硬件做到这一点."
由于我没有Arduino,我抓起了一个我已经铺设的USB闪存驱动器并开始在谷歌上搜索有关它的信息.我在这方面没有找到太多有用的信息,所以我现在在这里问:我是否可以访问USB驱动器的硬件(例如LED)并通过某些编程环境与它进行交互(我当时认为C#应该可能有办法做到这一点)?
此外,与此主题相关 - 有谁知道USB驱动器使用什么样的命令?例如,SCSI存储设备具有标准化的命令集; ATA设备具有类似的协议.如何向USB存储设备发出简单的读/写命令?
关于Windows平台,我们可以查找一个事件,告诉我们什么时候插入USB驱动器或任何类型的便携式媒体?
我正在编写一个应用程序,通过侦听WM_DEVICECHANGE消息来检测何时插入某个USB大容量存储设备以及何时拔下插头.
我还注册了我的应用程序来监听WM_DEVICECHANGE消息DBT_DEVTYP_DEVICEINTERFACE(使用RegisterDeviceNotification API调用),当插入或拔出USB大容量存储设备时,我得到了消息DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE消息.
现在,当插入具有多个卷的USB设备,然后拔下插头时,会出现问题.
插入设备时,我收到以下消息:
WM_DEVICECHANGE(DBT_DEVICEARRIVAL类型DBT_DEVTYP_DEVICEINTERFACE)WM_DEVICECHANGE(DBT_DEVICEARRIVAL类型DBT_DEVTYP_VOLUME)WM_DEVICECHANGE(DBT_DEVICEARRIVAL类型DBT_DEVTYP_VOLUME)插入时出现以下消息:
WM_DEVICECHANGE(DBT_DEVICEREMOVECOMPLETE类型DBT_DEVTYP_VOLUME)WM_DEVICECHANGE(DBT_DEVICEREMOVECOMPLETE类型DBT_DEVTYP_DEVICEINTERFACE)因此,即使有两个卷,也只有一个删除消息.为什么??
我有两个问题:
DBT_DEVTYP_DEVICEINTERFACE消息与DBT_DEVTYP_VOLUME消息相关联(实质上,我如何知道哪个VOLUME消息对应于哪个DEVICEINTERFACE消息 - 因为我同时获得了设备)?我正处于需要USB连接的设备开发的早期阶段.设备必须至少作为传统串行端口出现,但如果它可以同时显示为大容量存储设备,它将非常有用.
这是可能的,还是设备需要在大容量存储设备和通信设备之间切换,以便一次只能做一件事?
**[编辑]**我可能有点快速解决问题; 这表明它确实可以使用USB复合设备框架完成.如果有人对此有任何经验并且可能有一些提示或指针,使用了什么平台,以及他们可能使用过的任何第三方工具或堆栈,我仍然会感兴趣.
I have an embedded device with a USB connection. When the user plugs the device into their PC (Windows, OSX), how does the operating system discover what drivers to install? How do I get my drivers to be selected? Can they reside on some central server (run by the OS vendor)?
如何在Delphi中检索USB闪存驱动器的制造商序列号?
我试过这个:
function GetDiskVolSerialID(ADriveName: Char): Cardinal;
var
DiskDrive: string;
FileSystemFlags: DWORD;
VolumeSerialNumber: DWORD;
MaximumComponentLength: DWORD;
begin
DiskDrive := ADriveName + ':\';
GetVolumeInformation(PChar(DiskDrive),
nil,
0,
@VolumeSerialNumber,
MaximumComponentLength,
FileSystemFlags,
nil,
0);
Result := VolumeSerialNumber;
end;
Run Code Online (Sandbox Code Playgroud)
但它没有返回正确的结果!
我无法弄清楚这里的格式规则..我的例子中有太多行代码为每行添加4个空格,所以这里是我需要帮助的代码的链接
http://nitemsg.blogspot.com/2011/01/heres-unit-written-in-delphi-7-that-you.html
我遇到的问题是我对delphi不太了解将此代码与表单一起使用.我只是一个拖放程序员.
当我检测到USB设备时,showmessage('friendly name ='+ ...)的例子就是我所需要的.
干杯,
我正在尝试与PS3的DS3控制器连接.我已经设法C#使用了一个实现,libusb但决定将我的实现移动到java.不幸的是,我转向java并不是那么顺利.该设备似乎在设备列表中找到,但当我尝试打开它时,我收到以下错误"USB错误4:无法打开USB设备:没有这样的设备(可能已断开连接)"
public class Main {
private static final short VID = 0x054c;
private static final short PID = 0x0268;
Context context;
public Main() {
context = new Context();
int result = LibUsb.init(context);
if (result != LibUsb.SUCCESS) {
throw new LibUsbException("Unable to initialize libusb.", result);
}
ByteBuffer data = ByteBuffer.allocate(49);
DeviceHandle ds3Handle = getDeviceHandle(findDevice(VID, PID));
LibUsb.controlTransfer(ds3Handle, (byte)0xa1, (byte)0x1, (short)0x101, (short)0, data, 1000L);
LibUsb.exit(context);
}
private Device findDevice(int vid, int pid) {
Device UsbDevice = …Run Code Online (Sandbox Code Playgroud) TP-Link无线适配器仅提供Windows驱动程序.TP-Link没有提供驱动程序,也没有表明他们打算这样做.
有第三方驱动程序吗?
如果我插入设备,然后说,/dev/ttyUSB0并且我想0根据其VID:PID(使用找到lsusb)获取该号码,那么在C ++ Linux中该怎么做?我有这段代码可以找到一个打印机设备,如果有帮助的话:
int printer_open (void)
{
char printer_location[] = "/dev/usb/lpX";
struct stat buf;
// continuously try all numbers until stat returns true for the connected printer
for (int i = 0; i < 10; i++)
{
printer_location[11] = '0' + i;
if (!stat (printer_location, &buf))
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)