You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在macOS平台下如何通过libftdi/libusb获取可读取的字节数?

在macOS平台下如何通过libftdi/libusb获取可读取的字节数?

嘿,这个问题我之前在macOS上用libftdi开发的时候也碰到过,原来依赖ioctl的那套逻辑确实没法直接用了,给你分享两个靠谱的解决办法:

首先先还原下你之前的代码,方便对照:

我们切换到libftdi前用的代码是:

uint32_t BytesAvailable(int file) {
    if ( file < 0 ) { return 0; }

    uint32_t available = 0;

    int result = ioctl(file, FIONREAD, &available);
    if ( result == -1 ) { return 0; }

    return available;
}

方法一:用libftdi原生封装的函数(推荐)

libftdi其实已经给我们封装好了对应的功能,直接调用ftdi_read_queue_status()函数就能获取接收队列里待读取的字节数,不用再自己操作底层的USB控制命令。

给你写个适配的示例代码:

#include <ftdi.h>

uint32_t BytesAvailable(struct ftdi_context *ftdi) {
    // 先检查上下文和设备是否有效
    if (ftdi == NULL || !ftdi->usb_dev) {
        return 0;
    }

    int ret;
    uint32_t available_bytes = 0;
    // 调用libftdi的队列状态获取函数
    ret = ftdi_read_queue_status(ftdi, &available_bytes);
    if (ret < 0) {
        // 要是出错了,可以用ftdi_get_error_string(ftdi)拿到具体错误信息
        return 0;
    }

    return available_bytes;
}

这个函数的逻辑和你原来的代码很像,只是把ioctl的调用换成了libftdi的封装函数,在macOS上完全兼容,而且不用管底层libusb的细节。

方法二:直接用libusb底层操作(备用)

如果你因为libftdi版本问题没法用上面的函数,也可以直接通过libusb发送FTDI的特定控制命令来获取字节数:

  • 发送FTDI的SIO_RX_BYTES_AVAILABLE控制请求(请求码是0x0C)
  • 设备会返回当前接收缓冲区里的字节数

不过说实话,除非特殊情况,还是用方法一更省心,毕竟libftdi已经把这些细节都封装好了。

最后提两个小注意点:

  • 调用这些函数前,一定要确保你的ftdi上下文已经正确初始化,设备也已经通过ftdi_usb_open()之类的函数成功打开了
  • 如果返回0,要么是设备没连接/没打开,要么是确实没有待读取的数据,也可能是调用出错了,可以加个错误日志排查下

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:48:07