0

-我从事温度和湿度读取设备的开发。我们有自己的温湿度读取设备(基于 USB 的 COM(串行)端口设备)。目前,我们使用独立软件获取该软件,该软件使用虚拟 com 端口驱动器与设备进行通信。但是,我想使用“网络串行 API”在我的网络应用程序中读取这些记录的数据。

在编写代码以读取该数据时,我无法获取数据。我正在关注“ https://web.dev/serial/ ”这篇文章来读取数据。

- 我应该使用带有 Web 串行 API 的虚拟 comport 驱动程序来读取数据吗?

那么我该怎么做才能使用“web serial API”读取usb com端口设备数据。

--这是我的写入和读取数据的代码。

<script>
class LineBreakTransformer {
      constructor() {
        this.chunks = "";
      }

      transform(chunk, controller) {
        this.chunks += chunk;
        const lines = this.chunks.split("\r\n");
        this.chunks = lines.pop();
        lines.forEach((line) => controller.enqueue(line));
      }

      flush(controller) {
        controller.enqueue(this.chunks);
      }
  }
async function onStartButtonClick() {
    try {
      const port = await navigator.serial.requestPort();
      console.log("req");
      await port.open({ baudRate: 19200,       
                        dataBits: 8,
                        stopBits: 1,
                        parity: "none",
                        flowControl: "none",
    });
    const {usbProductId, usbVendorId}=port.getInfo();
    document.getElementById("sdata").innerHTML=usbProductId+" "+ " <br>"+usbVendorId;
    
      console.log("opanning");
        
                        

                const writer = port.writable.getWriter();
                 console.log("true is");
                const data = new Uint8Array([0x32]); 
            
                await writer.write(data);
                console.log("succ");

        
            writer.releaseLock();

      while (port.readable) {
        
        const textDecoder = new TextDecoderStream();
        const readableStreamClosed = port.readable.pipeTo(textDecoder.writable);
        const reader = textDecoder.readable
        .pipeThrough(new TransformStream(new LineBreakTransformer()))
        .getReader();
        console.log("portreadable");

        try {
          while (true) {
            const { value, done } = await reader.read();
            if (done) {
              console.log("Canceled");
              break;
            }
            console.log("tryfun");
            console.log(value);
          }
        } catch (error) {
          console.log("Error: Read");
          console.log(error);
        } finally {
          reader.releaseLock();
        }
      }
    } catch (error) {
      console.log("Error: Open");
      console.log(error);
    }

     
  }

在此处输入图像描述

4

1 回答 1

1

我应该使用带有 Web 串行 API 的虚拟 comport 驱动程序来读取数据吗?

您的问题的答案是肯定的,无论安装什么驱动程序,允许您将设备用于您的独立软件,都应该让您在使用 WebSerial 时访问该设备。

我的假设是您的浏览器在调用后会向您显示串行设备列表,navigator.serial.requestPort()并且您可以选择所需的设备并单击“连接”按钮。如果您没有看到对话框或对话框上的设备,请查看设备管理器以更好地了解需要如何访问设备(例如,它可能需要 WebUSB)。

您的 port.open 只需要波特率,其余值 8N1,没有硬件流控制,是默认值。

await port.open({ baudRate: 19200 });

您可能希望简化您的初始代码,以查看您的设备在您写入后实际返回的内容。位于https://streams.spec.whatwg.org/#rs-intro上的这段代码应该有助于实现这一目标。

console.log(await readAllChunks(port.readable));

function readAllChunks(readableStream) {
  const reader = readableStream.getReader();
  const chunks = [];

  return pump();

  function pump() {
    return reader.read().then(({ value, done }) => {
      if (done) {
        return chunks;
      }

      chunks.push(value);
      return pump();
    });
  }
}
于 2022-02-25T05:26:38.570 回答