首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript中用web串行api读取USB串口数据

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

Stack Overflow用户
提问于 2022-01-31 02:37:54
回答 1查看 2.1K关注 0票数 0

-I负责温湿度读数装置的开发。我们有自己的温湿度读写器(基于USB的COM(串行)端口设备).目前,我们使用虚拟com端口驱动器与设备通信的with独立软件。但是,我想使用“”在我的web应用程序中读取这些记录数据。

在编写读取数据的代码时,我无法获取数据。我跟随"https://web.dev/serial/“这篇文章来阅读数据。

-should我使用一个虚拟的comport驱动程序和web串行API来读取数据吗?

那么,我能做些什么来读取usb端口设备数据与"web串行API“。

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

代码语言:javascript
复制
<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);
    }

     
  }

EN

回答 1

Stack Overflow用户

发布于 2022-02-25 05:26:38

是否应该使用带有web串行API的虚拟comport驱动程序来读取数据?

对您的问题的回答是肯定的,无论安装了什么驱动程序,如果您可以使用设备作为独立软件,那么在使用WebSerial时应该可以访问该设备。

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

您的port.open只需要are,因为其余的值,8N1,没有硬件流控制,是缺省值。

代码语言:javascript
复制
await port.open({ baudRate: 19200 });

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

代码语言:javascript
复制
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();
    });
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70920727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档