OS X - 如何访问 USB 打印机
OS X - how to get access to USB printer
我尝试为 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 returns 错误
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 与打印机交互?
大多数 USB 设备的主要协议通常不是通过设备请求实现的。相反,每个设备通常有一个或多个 USB 接口,每个接口都有一个或多个端点。您通过管道与这些端点通信。在 macOS 上,你用 CreateInterfaceIterator
枚举设备的接口以获得 IOUSBInterfaceInterface
句柄(或者如果它是 composite/well-known 设备类型,你可以在 IOKit 匹配时直接匹配接口),然后 read/write 到具有 ReadPipe
/WritePipe
系列函数的管道。 (有 Async and/or TO (timeout) 后缀的变体,我最常使用 ReadPipeAsyncTO
/WritePipeAsyncTO
因为它们给你最大的控制权。)
我尝试为 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 returns 错误
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 与打印机交互?
大多数 USB 设备的主要协议通常不是通过设备请求实现的。相反,每个设备通常有一个或多个 USB 接口,每个接口都有一个或多个端点。您通过管道与这些端点通信。在 macOS 上,你用 CreateInterfaceIterator
枚举设备的接口以获得 IOUSBInterfaceInterface
句柄(或者如果它是 composite/well-known 设备类型,你可以在 IOKit 匹配时直接匹配接口),然后 read/write 到具有 ReadPipe
/WritePipe
系列函数的管道。 (有 Async and/or TO (timeout) 后缀的变体,我最常使用 ReadPipeAsyncTO
/WritePipeAsyncTO
因为它们给你最大的控制权。)