我尝试编写OS X的应用程序,该应用程序将在与USB连接的Xprinter xp-370b上打印条形码。 我使用IOKit库。
我可以在我的代码中以io_service_t device;
的形式获得此打印机的设备对象。然后,我创建IOUSBDeviceInterface **dev;
并使用(*dev)->USBDeviceOpen(dev);
打开设备。
如何向该设备发送任何消息?我尝试:
IOReturn WriteToDeviceZ(IOUSBDeviceInterface **dev, UInt16 length, UInt8 writeBuffer[])
{
IOUSBDevRequest request;
IOReturn kr;
USBDeviceAddress address;
kr = (*dev)->GetDeviceAddress(dev, &address);
if (kr != kIOReturnSuccess)
{
printf("No address err 0x%x\n", kr);
return kr;
}
request.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBVendor, kUSBDevice);
request.bRequest = 0xa0;
request.wValue = address;
request.wIndex = 0;
request.wLength = length;
request.pData = writeBuffer;
return (*dev)->DeviceRequest(dev, &request);
}
但是ii返回错误
kr = WriteToDeviceZ(dev, sizeof(array), array);
if (kr != kIOReturnSuccess)
{
printf("WriteToDevice reset returned err 0x%x\n", kr);
(*dev)->USBDeviceClose(dev);
(*dev)->Release(dev);
return kr;
}
WriteToDevice reset returned err 0xe000404f
也许还有另一种方法可以通过USB与打印机交互?
答案 0 :(得分:1)
大多数USB设备的主要协议通常不是通过设备请求实现的。相反,每个设备通常具有一个或多个USB接口,每个USB接口具有一个或多个端点。您通过管道与这些端点进行通信。在macOS上,您使用CreateInterfaceIterator
枚举设备的接口以获得IOUSBInterfaceInterface
的句柄(或者,如果它是复合/知名设备类型,则可以在IOKit匹配期间直接匹配该接口),然后读取/使用ReadPipe
/ WritePipe
系列函数写入管道。 (有些带有Async和/或TO(超时)后缀的变体,我经常使用ReadPipeAsyncTO
/ WritePipeAsyncTO
,因为它们可以为您提供最大的控制权。)