【问题标题】:WebUSB and FTDI232WebUSB 和 FTDI232
【发布时间】:2018-07-31 02:06:05
【问题描述】:

我尝试连接到串行 USB 接口 (FT232),但找不到任何关于如何配置它的信息...

我有什么:

我需要什么:

我需要使用WebUSB连接到这个接口,发送消息,阅读消息。

我所取得的成就:

现在,我可以连接到界面并“读取”某些内容。

我的问题:

我在网上找不到任何关于如何配置 USB 接口的信息,串口配置必须是 57600 baud/s, E, 8, 1 但我找不到任何关于如何配置这些值的信息...

请参阅以下代码,据我了解,我必须在 controlTransferOut 中添加一些值,但我找不到要放置的内容以及原因..

device = await navigator.usb.requestDevice({ 'filters': [] });
console.log(device);

await device.open();
if (device.configuration === null) {
    await device.selectConfiguration(1);
}
await device.claimInterface(0);
await device.selectAlternateInterface(0, 0);
await device.controlTransferOut({ /* WHAT DO I PUT HERE?? */ });
let result = await device.transferIn(1, 64);
console.log((new TextDecoder).decode(result.data));

我可以从“我已经取得的成就”部分读到的是单个字符,因为串行配置不正确。

我对其进行了调整以使其正常工作,我用另一个软件打开了串行端口,配置它,关闭了另一个软件,然后用 webusb 连接到 USB 接口并读取消息。这行得通,但方式很复杂......

任何帮助将不胜感激:)

【问题讨论】:

    标签: webusb


    【解决方案1】:

    根据datasheet,您的 TTL-232RG-VSW5V-WE 电缆包含一个 FT232R 芯片。其数据表是here。我希望找到该芯片支持的协议的描述,但我发现的只是documentation 的专有驱动程序。

    另一方面,我知道 Linux 支持这些芯片,所以内核驱动程序中必须有代码来设置波特率。有问题的函数是change_speed() in ftdi_sio.c

    由此看来,您需要发送的控制传输是,

    device.controlTransferOut({ requestType: 'vendor',
                                recipient: 'device',
                                request: 3 /* FTDI_SIO_SET_BAUDRATE_REQUEST */, 
                                value: divisor_value,
                                index: divisor_index });
    

    divisor_valuedivisor_index是芯片时钟除数的低16位和高16位,由ftdi_232bm_baud_to_divisor函数根据请求的波特率计算得出。

    希望这是阅读代码并弄清楚您需要什么的良好开端。

    【讨论】:

    • 确实是一个好的开始!非常感谢,我会尝试阅读这 2500 行代码文件并希望它能够工作?
    • 希望您不需要阅读整个文件。 change_speed() 和它调用来计算除数的函数真的是你所需要的。 :P
    • 有人能解决这个问题吗?
    【解决方案2】:

    非常感谢。它就像一个魅力。 我算出波特率 9600:

        device.controlTransferOut({
            requestType: "vendor",
            recipient: "device",
            request: 3 /* FTDI_SIO_SET_BAUDRATE_REQUEST */,
            value: 16696, // divisor_value
            index: 48000000 // divisor_index
        });
    

    【讨论】:

    • 感谢您的分享,目前无法测试,但您能否添加有关如何计算 valueindex 值的详细信息?
    • 我使用了来自 linux 内核源代码的ftdi_2232h_baud_base_to_divisor 函数(例如:ftdi_sio.c)。该函数返回值,索引是调用者的基本参数(时钟)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多