【问题标题】:Javascript and serial port communicationJavascript和串口通信
【发布时间】:2018-11-30 09:53:43
【问题描述】:

我正在研究串行端口通信。要求是使用javascript通过串口与硬件通信。我现在正在研究 chrome WEB-USB-API

使用此 API,我能够连接到设备。现在我想向连接的设备发送命令,有人可以指导我吗?

device.controlTransferOut({requestType: 'class',recipient:'interface',request: 0x22,value: 0x01,index: 0x02})

上述代码在 web-usb-api 文档页面上给出,但无法了解如何通过它发送任何命令。

任何与 javascript 和串行端口通信相关的指导都会非常有帮助。

【问题讨论】:

  • 该代码是从then 链调用的吗?
  • 是的......它是从链中调用的。我没有在此代码中将我的命令发送到哪里 ` {requestType: 'class',recipient:'interface',request: 0x22,value: 0x01,index: 0x02} ` 这些参数是什么?我如何知道我的硬件的请求类型、接收者请求和价值。我对硬件和串口等这些东西完全陌生。

标签: javascript serial-port webusb


【解决方案1】:

这里需要一些关于 USB 协议和 USB CDC-ACM(“串行”的花哨名称)协议的背景知识:控制传输发送和接收少量数据,通常用于启用和禁用设备功能。在上面的 sn-p 中发送的控制传输来自 USB CDC-ACM 协议,是一个 SET_CONTROL_LINE_STATE 命令。当发送到实际的 USB 串行适配器时,它会告诉适配器在串行线上断言 DTR 信号,这允许连接的串行设备检测主机已准备好接收数据。在仅模拟 USB 串行适配器的设备中,例如本示例所针对的设备,它只是表明所有主机软件都已初始化并且设备已准备好发送数据。

现在,有了这个背景,应该清楚这不是您将自己的命令发送到设备的方式。设备期望它们作为虚拟串行端口上的数据发送,而不是作为关于其状态的控制信号。为此,您需要使用 transferOut() 函数。这接受两个参数,第一个是发送数据的端点号,第二个是数据本身。在博客文章的示例中,仅使用了 transferIn() 函数。在此示例中,它从端点 5 读取 64 个字节。虽然文章中没有显示,但用于将数据发送回设备的端点是端点 4。对于您自己的设备,您应该检查 USB 设备描述符以确定适当的端点用于发送和接收数据。这些描述符在 USBDevice 对象的configurations 属性下可用。

【讨论】:

  • 谢谢赖利!我尝试了代码并从 USBDevice 对象添加了适当的接口和端点编号。然而不知何故 transferOut API 工作,我没有得到任何错误,但是当我为 transferIn 协议添加代码时,我收到以下错误:“DOMException:指定的端点不是声明和选择的备用接口的一部分。”这是我的对象部分,显示端点号`USBEndpoint {endpointNumber:1,方向:“in”,类型:“bulk”,packetSize:64}`如果我遗漏了什么,你能建议一下吗。
  • 我能够解决该错误,但现在发生的情况是我在执行时没有收到任何错误,但我收到的结果对象有空的 DataView。你能提供任何建议来说明为什么它会这样返回吗?
猜你喜欢
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多