WebUSB 和 FTDI232
WebUSB and FTDI232
我尝试连接到串行 USB 接口 (FT232),但找不到有关如何配置它的任何信息...
我得到了什么:
- 来自 FTDI 的串口转 USB 接口,它是 TTL-232RG-VSW5V-WE from this page
- 通过 RS232 发送消息的自定义板
我需要什么:
我需要使用WebUSB连接到这个接口,发送消息,阅读消息。
我取得的成就:
现在,我可以连接到接口和 "read" 东西。
我的问题:
我在网上找不到任何关于如何配置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));
我从"What I've achieved"部分读到的是单个字符,因为序列号配置不当。
我对它进行了一些调整,让它可以正常工作,我用另一个软件打开串口,配置它,关闭另一个软件,然后用 webusb 连接到 USB 接口并读取消息。那行得通,但是太复杂了...
任何帮助将不胜感激:)
根据datasheet your TTL-232RG-VSW5V-WE cable contains a FT232R chip. The datasheet for that is here. I was hoping to discover a description of the protocol that the chip supports but all I found was documentation他们专有的驱动程序。
另一方面,我知道Linux支持这些芯片,所以内核驱动程序中必须有设置波特率的代码。有问题的函数是 ftdi_sio.c.
中的 change_speed()
由此看来,您需要发送的控制传输是,
device.controlTransferOut({ requestType: 'vendor',
recipient: 'device',
request: 3 /* FTDI_SIO_SET_BAUDRATE_REQUEST */,
value: divisor_value,
index: divisor_index });
divisor_value
和divisor_index
为芯片时钟分频器的低16位和高16位,由ftdi_232bm_baud_to_divisor
函数根据请求的波特率计算得到。
希望这是阅读代码和弄清楚您需要什么的良好开端。
非常感谢。它就像一个魅力。
我算出波特率 9600:
device.controlTransferOut({
requestType: "vendor",
recipient: "device",
request: 3 /* FTDI_SIO_SET_BAUDRATE_REQUEST */,
value: 16696, // divisor_value
index: 48000000 // divisor_index
});
我尝试连接到串行 USB 接口 (FT232),但找不到有关如何配置它的任何信息...
我得到了什么:
- 来自 FTDI 的串口转 USB 接口,它是 TTL-232RG-VSW5V-WE from this page
- 通过 RS232 发送消息的自定义板
我需要什么:
我需要使用WebUSB连接到这个接口,发送消息,阅读消息。
我取得的成就:
现在,我可以连接到接口和 "read" 东西。
我的问题:
我在网上找不到任何关于如何配置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));
我从"What I've achieved"部分读到的是单个字符,因为序列号配置不当。
我对它进行了一些调整,让它可以正常工作,我用另一个软件打开串口,配置它,关闭另一个软件,然后用 webusb 连接到 USB 接口并读取消息。那行得通,但是太复杂了...
任何帮助将不胜感激:)
根据datasheet your TTL-232RG-VSW5V-WE cable contains a FT232R chip. The datasheet for that is here. I was hoping to discover a description of the protocol that the chip supports but all I found was documentation他们专有的驱动程序。
另一方面,我知道Linux支持这些芯片,所以内核驱动程序中必须有设置波特率的代码。有问题的函数是 ftdi_sio.c.
中的change_speed()
由此看来,您需要发送的控制传输是,
device.controlTransferOut({ requestType: 'vendor',
recipient: 'device',
request: 3 /* FTDI_SIO_SET_BAUDRATE_REQUEST */,
value: divisor_value,
index: divisor_index });
divisor_value
和divisor_index
为芯片时钟分频器的低16位和高16位,由ftdi_232bm_baud_to_divisor
函数根据请求的波特率计算得到。
希望这是阅读代码和弄清楚您需要什么的良好开端。
非常感谢。它就像一个魅力。 我算出波特率 9600:
device.controlTransferOut({
requestType: "vendor",
recipient: "device",
request: 3 /* FTDI_SIO_SET_BAUDRATE_REQUEST */,
value: 16696, // divisor_value
index: 48000000 // divisor_index
});