【问题标题】:OS X - how to get access to USB printerOS X - 如何访问 USB 打印机
【发布时间】:2018-08-01 11:46:54
【问题描述】:

我尝试为 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 与打印机交互?

【问题讨论】:

    标签: macos printing usb iokit


    【解决方案1】:

    大多数 USB 设备的主要协议通常不是通过设备请求实现的。相反,每个设备通常具有一个或多个 USB 接口,每个 USB 接口具有一个或多个端点。您通过管道与这些端点进行通信。在 macOS 上,您使用CreateInterfaceIterator 枚举设备的接口以获得IOUSBInterfaceInterface 句柄(或者如果它是复合/知名设备类型,您可以在 IOKit 匹配期间直接匹配接口),然后读取/写入管道使用ReadPipe/WritePipe 系列函数。 (有一些带有 Async 和/或 TO(超时)后缀的变体,我最常使用 ReadPipeAsyncTO/WritePipeAsyncTO,因为它们为您提供了最大的控制权。)

    【讨论】:

    • 我怎样才能从 'IOUSBDeviceInterface' 获得IOUSBInterfaceInterface?
    • 我试试这个。但是迭代器没有任何 interfaceRefs IOUSBFindInterfaceRequest request; io_iterator_t intIterator; io_service_t interfaceRef; (*dev)->CreateInterfaceIterator(dev, &request, &intIterator); while ((interfaceRef = IOIteratorNext(intIterator)) != 0) { }
    • 需要填写请求结构体。
    • 设置 request.bInterfaceClass = kIOUSBFindInterfaceDontCare; request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; request.bAlternateSetting = kIOUSBFindInterfaceDontCare; 对我有用。现在我有了设备接口
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 2018-05-29
    • 2017-05-17
    • 1970-01-01
    • 2021-11-02
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多