繁体   English   中英

在javascript中用web串口api读取USB串口数据

[英]Read USB serial port data with web serial api in javascript

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

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

-我是否应该使用带有 web 序列号 API 的虚拟端口驱动程序来读取数据?

那么我该怎么做才能使用“Web 串行 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);
    }

     
  }

在此处输入图像描述

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

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

我的假设是您的浏览器在调用navigator.serial.requestPort()后向您显示串行设备列表,并且您能够 select 目标设备并单击“连接”按钮。 如果您没有看到对话框或对话框中的设备,请查看设备管理器以更好地了解需要如何访问设备(例如,它可能需要 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();
    });
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM