Bắt đầu sử dụng Web Serial API

1. Giới thiệu

Lần cập nhật gần đây nhất: ngày 19 tháng 09 năm 2022

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ xây dựng một trang web sử dụng Web Serial API để tương tác với bảng BBC micro:bit để hiển thị hình ảnh trên ma trận LED 5x5. Bạn sẽ tìm hiểu về Web Serial API cũng như cách sử dụng luồng có thể đọc, có thể ghi và biến đổi để giao tiếp với thiết bị nối tiếp thông qua trình duyệt.

67543f4caaaca5de.png.

Kiến thức bạn sẽ học được

  • Cách mở và đóng cổng Web Serial
  • Cách sử dụng vòng lặp đọc để xử lý dữ liệu từ luồng đầu vào
  • Cách gửi dữ liệu ra ngoài qua luồng ghi

Bạn cần có

Chúng tôi đã chọn sử dụng micro:bit v1 cho lớp học lập trình này vì nó có giá cả phải chăng, cung cấp một vài đầu vào (nút) và đầu ra (màn hình LED 5x5) cũng như có thể cung cấp thêm đầu vào và đầu ra. Hãy xem trang micro:bit củaBBC trên trang web Espruino để biết chi tiết về chức năng của micro:bit.

2. Giới thiệu về Web Serial API

Web Serial API cung cấp một cách để các trang web đọc và ghi vào thiết bị nối tiếp có tập lệnh. API kết nối web và thế giới thực bằng cách cho phép các trang web giao tiếp với thiết bị nối tiếp, chẳng hạn như bộ vi điều khiển và máy in 3D.

Có nhiều ví dụ về phần mềm điều khiển được xây dựng bằng công nghệ web. Ví dụ:

Trong một số trường hợp, các trang web này giao tiếp với thiết bị thông qua một ứng dụng tác nhân gốc do người dùng cài đặt theo cách thủ công. Trong các trường hợp khác, ứng dụng được phân phối trong một ứng dụng gốc đóng gói thông qua một khung như Electron. Trong các trường hợp khác, người dùng bắt buộc phải thực hiện một bước bổ sung, chẳng hạn như sao chép ứng dụng đã biên dịch vào thiết bị có ổ USB flash.

Bạn có thể cải thiện trải nghiệm người dùng bằng cách cung cấp hoạt động giao tiếp trực tiếp giữa trang web và thiết bị mà trang web đang kiểm soát.

3. Thiết lập

Lấy mã

Chúng tôi đã đưa mọi thứ bạn cần cho lớp học lập trình này vào một dự án Glitch.

  1. Mở một thẻ trình duyệt mới rồi truy cập https://web-serial-codelab-start.glitch.me/.
  2. Nhấp vào đường liên kết Phối lại trục trặc để tạo phiên bản dự án khởi đầu của riêng bạn.
  3. Nhấp vào nút Show (Hiển thị), sau đó chọn In a New Window (Trong cửa sổ mới) để xem mã hoạt động.

4. Mở kết nối nối tiếp

Kiểm tra xem API Web Serial có được hỗ trợ hay không

Việc đầu tiên cần làm là kiểm tra xem Web Serial API có được hỗ trợ trong trình duyệt hiện tại hay không. Để làm việc đó, hãy kiểm tra xem serial có trong navigator hay không.

Trong sự kiện DOMContentLoaded, hãy thêm mã sau vào dự án:

script.js - DOMContentLoaded

// CODELAB: Add feature detection here.
const notSupported = document.getElementById('notSupported');
notSupported.classList.toggle('hidden', 'serial' in navigator);

Thao tác này sẽ kiểm tra xem Serial Web Serial có được hỗ trợ hay không. Nếu đúng như vậy, mã này sẽ ẩn biểu ngữ cho biết rằng Web Serial không được hỗ trợ.

Thử nào

  1. Tải trang.
  2. Xác minh rằng trang không hiển thị biểu ngữ màu đỏ cho biết rằng Web Serial không được hỗ trợ.

Mở cổng nối tiếp

Tiếp theo, chúng ta cần mở cổng nối tiếp. Giống như hầu hết các API hiện đại khác, Web Serial API không đồng bộ. Thao tác này ngăn giao diện người dùng chặn khi chờ dữ liệu đầu vào, nhưng điều này cũng rất quan trọng vì trang web có thể nhận được dữ liệu nối tiếp bất cứ lúc nào và chúng ta cần có một cách để theo dõi dữ liệu đó.

Vì một máy tính có thể có nhiều thiết bị nối tiếp, nên khi trình duyệt cố gắng yêu cầu một cổng, trình duyệt sẽ nhắc người dùng chọn thiết bị cần kết nối.

Thêm mã sau vào dự án của bạn:

script.js - connect()

// CODELAB: Add code to request & open port here.
// - Request a port and open a connection.
port = await navigator.serial.requestPort();
// - Wait for the port to open.
await port.open({ baudRate: 9600 });

Lệnh gọi requestPort sẽ nhắc người dùng về thiết bị mà họ muốn kết nối. Nếu gọi port.open, cổng sẽ mở ra. Chúng ta cũng cần cung cấp tốc độ mà chúng ta muốn giao tiếp với thiết bị nối tiếp. BBC micro:bit sử dụng kết nối tốc độ 9600 baud giữa chip USB nối tiếp và bộ xử lý chính.

Ngoài ra, hãy kết nối nút kết nối và yêu cầu nút này gọi connect() khi người dùng nhấp vào nút này.

Thêm mã sau vào dự án của bạn:

script.js - clickConnect()

// CODELAB: Add connect code here.
await connect();

Thử nào

Dự án của chúng tôi hiện đã có đủ điều kiện tối thiểu để bắt đầu. Khi nhấp vào nút Connect (Kết nối), người dùng sẽ được nhắc chọn thiết bị nối tiếp để kết nối, sau đó kết nối với micro:bit.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Trên thẻ này, bạn sẽ thấy một biểu tượng cho biết bạn đã kết nối với một thiết bị nối tiếp:

e695daf2277cd3a2.png

Thiết lập luồng đầu vào để theo dõi dữ liệu từ cổng nối tiếp

Sau khi thiết lập kết nối, chúng ta cần thiết lập luồng đầu vào và trình đọc để đọc dữ liệu qua thiết bị. Trước tiên, chúng ta lấy luồng có thể đọc được từ cổng bằng cách gọi port.readable. Vì biết rằng chúng tôi sẽ nhận lại được văn bản từ thiết bị, nên chúng tôi sẽ truyền văn bản đó qua bộ giải mã văn bản. Tiếp theo, chúng ta sẽ tìm một người đọc và bắt đầu vòng lặp đọc.

Thêm mã sau vào dự án của bạn:

script.js - connect()

// CODELAB: Add code to read the stream here.
let decoder = new TextDecoderStream();
inputDone = port.readable.pipeTo(decoder.writable);
inputStream = decoder.readable;

reader = inputStream.getReader();
readLoop();

Vòng lặp đọc là một hàm không đồng bộ chạy trong vòng lặp và chờ nội dung mà không chặn luồng chính. Khi có dữ liệu mới, trình đọc sẽ trả về hai thuộc tính: boolean valuedone. Nếu giá trị done là true, thì cổng đã đóng hoặc không có thêm dữ liệu nào được chuyển vào.

Thêm mã sau vào dự án của bạn:

script.js - readLoop()

// CODELAB: Add read loop here.
while (true) {
  const { value, done } = await reader.read();
  if (value) {
    log.textContent += value + '\n';
  }
  if (done) {
    console.log('[readLoop] DONE', done);
    reader.releaseLock();
    break;
  }
}

Thử nào

Dự án của chúng ta hiện có thể kết nối với thiết bị này và sẽ nối mọi dữ liệu nhận được từ thiết bị đó vào phần tử nhật ký.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy biểu trưng của Espruino:

dd52b5c37fc4b393.png

Thiết lập luồng đầu ra để gửi dữ liệu đến cổng nối tiếp

Giao tiếp nối tiếp thường có hai chiều. Ngoài việc nhận dữ liệu từ cổng nối tiếp, chúng ta cũng muốn gửi dữ liệu tới cổng. Tương tự như với luồng đầu vào, chúng ta sẽ chỉ gửi văn bản qua luồng đầu ra tới micro:bit.

Trước tiên, hãy tạo một sự kiện phát trực tiếp bộ mã hoá văn bản rồi chuyển sự kiện đó đến port.writeable.

script.js - connect()

// CODELAB: Add code setup the output stream here.
const encoder = new TextEncoderStream();
outputDone = encoder.readable.pipeTo(port.writable);
outputStream = encoder.writable;

Khi được kết nối nối tiếp với chương trình cơ sở Espruino, bảng điều khiển micro:bit của BBC hoạt động như một vòng lặp đọc-eval-print (repL) JavaScript, tương tự như mã bạn nhận được trong shell Node.js. Tiếp theo, chúng ta cần cung cấp một phương thức để gửi dữ liệu đến luồng. Mã dưới đây lấy một trình ghi từ luồng đầu ra và sau đó sử dụng write để gửi từng dòng. Mỗi dòng được gửi bao gồm một ký tự dòng mới (\n) để cho micro:bit đánh giá lệnh đã gửi.

script.js - writeToStream()

// CODELAB: Write to output stream
const writer = outputStream.getWriter();
lines.forEach((line) => {
  console.log('[SEND]', line);
  writer.write(line + '\n');
});
writer.releaseLock();

Để chuyển hệ thống sang trạng thái đã biết và ngăn hệ thống lặp lại các ký tự chúng ta gửi, chúng ta cần gửi Ctrl-C và tắt tiếng vọng.

script.js - connect()

// CODELAB: Send CTRL-C and turn off echo on REPL
writeToStream('\x03', 'echo(false);');

Thử nào

Dự án của chúng ta hiện có thể gửi và nhận dữ liệu từ micro:bit. Hãy xác minh rằng chúng ta có thể gửi lệnh đúng cách:

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Mở thẻ Bảng điều khiển trong Công cụ của Chrome cho nhà phát triển rồi nhập writeToStream('console.log("yes")');

Bạn sẽ thấy nội dung tương tự như sau được in trên trang:

15e2df0064b5de28.pngs

5. Điều khiển ma trận đèn LED

Tạo chuỗi lưới ma trận

Để điều khiển ma trận LED trên micro:bit, chúng ta cần gọi show(). Phương pháp này hiển thị đồ hoạ trên màn hình LED 5x5 tích hợp. Hàm này sẽ lấy số nhị phân hoặc một chuỗi.

Chúng ta sẽ lặp lại các hộp đánh dấu và tạo một mảng các giá trị 1s và 0s cho biết quảng cáo nào được đánh dấu và ô nào không được đánh dấu. Sau đó, chúng ta cần đảo ngược mảng vì thứ tự của các hộp đánh dấu là ngược lại với thứ tự đèn LED trong ma trận. Tiếp theo, chúng ta chuyển đổi mảng thành một chuỗi và tạo lệnh để gửi đến micro:bit.

script.js - sendGrid()

// CODELAB: Generate the grid
const arr = [];
ledCBs.forEach((cb) => {
  arr.push(cb.checked === true ? 1 : 0);
});
writeToStream(`show(0b${arr.reverse().join('')})`);

Chọn hộp đánh dấu để cập nhật ma trận

Tiếp theo, chúng ta cần theo dõi các thay đổi trên hộp đánh dấu và nếu các hộp đánh dấu thay đổi, hãy gửi thông tin đó đến micro:bit. Trong mã phát hiện tính năng (// CODELAB: Add feature detection here.), hãy thêm dòng sau:

script.js - DOMContentLoaded

initCheckboxes();

Hãy đặt lại lưới khi micro:bit được kết nối lần đầu tiên để lưới hiển thị khuôn mặt vui vẻ. Hàm drawGrid() đã được cung cấp. Hàm này hoạt động tương tự như sendGrid(); nó sẽ lấy một mảng là 1s và 0s và chọn các hộp đánh dấu nếu phù hợp.

script.js - clickConnect()

// CODELAB: Reset the grid on connect here.
drawGrid(GRID_HAPPY);
sendGrid();

Thử nào

Giờ đây, khi trang mở một kết nối đến micro:bit, trang sẽ gửi một khuôn mặt vui vẻ. Khi nhấp vào các hộp đánh dấu, màn hình sẽ cập nhật trên ma trận đèn LED.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy một nụ cười xuất hiện trên ma trận LED micro:bit.
  5. Vẽ một mẫu khác trên ma trận LED bằng cách thay đổi các hộp đánh dấu.

6. Kết nối các nút micro:bit

Thêm sự kiện xem vào các nút micro:bit

Trên micro:bit có 2 nút, một nút nằm ở hai bên của ma trận LED. Espruino cung cấp hàm setWatch gửi một sự kiện/lệnh gọi lại khi người dùng nhấn nút. Do muốn nghe cả hai nút, chúng ta sẽ tạo hàm chung và in thông tin chi tiết của sự kiện.

script.js - watchButton()

// CODELAB: Hook up the micro:bit buttons to print a string.
const cmd = `
  setWatch(function(e) {
    print('{"button": "${btnId}", "pressed": ' + e.state + '}');
  }, ${btnId}, {repeat:true, debounce:20, edge:"both"});
`;
writeToStream(cmd);

Tiếp theo, chúng ta cần nối cả hai nút (có tên là BTN1 và BTN2 trên bảng micro:bit) mỗi khi cổng nối tiếp được kết nối với thiết bị.

script.js - clickConnect()

// CODELAB: Initialize micro:bit buttons.
watchButton('BTN1');
watchButton('BTN2');

Thử nào

Ngoài việc hiển thị khuôn mặt vui vẻ khi được kết nối, việc nhấn một trong các nút trên micro:bit sẽ thêm văn bản vào trang cho biết nút nào đã được nhấn. Nhiều khả năng nhất là mỗi ký tự sẽ nằm trên một dòng riêng.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy một nụ cười xuất hiện trên ma trận LED micro:bit.
  5. Nhấn các nút trên micro:bit và xác minh rằng nút này sẽ thêm văn bản mới vào trang cùng với thông tin chi tiết về nút được nhấn.

7. Sử dụng luồng biến đổi để phân tích cú pháp dữ liệu đến

Xử lý luồng cơ bản

Khi một trong các nút micro:bit được nhấn, micro:bit sẽ gửi dữ liệu đến cổng nối tiếp thông qua một luồng. Luồng rất hữu ích, nhưng cũng có thể là một thách thức vì bạn không nhất thiết phải nhận được tất cả dữ liệu cùng một lúc và có thể được chia nhỏ tuỳ ý.

Ứng dụng hiện in luồng đến khi đến (trong readLoop). Trong hầu hết các trường hợp, mỗi ký tự nằm trên một dòng riêng, nhưng điều này không hữu ích lắm. Tốt nhất là luồng nên được phân tích cú pháp thành từng dòng và mỗi thông báo hiển thị dưới dạng một dòng riêng.

Biến đổi luồng bằng TransformStream

Để làm việc đó, chúng ta có thể sử dụng luồng biến đổi ( TransformStream) để có thể phân tích cú pháp luồng đến và trả về dữ liệu đã phân tích cú pháp. Luồng biến đổi có thể nằm giữa nguồn của luồng (trong trường hợp này là micro:bit) và bất kỳ nội dung nào đang sử dụng luồng (trong trường hợp này là readLoop) và có thể áp dụng một biến đổi tuỳ ý trước khi biến đổi được sử dụng. Hãy xem tiện ích này giống như một dây chuyền lắp ráp: Khi một tiện ích xuất hiện trên dòng, mỗi bước trong dòng sẽ sửa đổi tiện ích để khi tới đích cuối cùng, tiện ích đó sẽ hoạt động đầy đủ.

Để biết thêm thông tin, hãy xem bài viết Các khái niệm về API Luồng của MDN.

Biến đổi luồng bằng LineBreakTransformer

Hãy tạo một lớp LineBreakTransformer. Lớp này sẽ lấy một luồng vào và phân đoạn dựa trên dấu ngắt dòng (\r\n). Lớp này cần có 2 phương thức, transformflush. Phương thức transform được gọi mỗi khi luồng nhận được dữ liệu mới. Thao tác này có thể thêm dữ liệu vào hàng đợi hoặc lưu dữ liệu để sử dụng sau. Phương thức flush được gọi khi luồng bị đóng và xử lý mọi dữ liệu chưa được xử lý.

Trong phương thức transform, chúng ta sẽ thêm dữ liệu mới vào container, sau đó kiểm tra xem có dấu ngắt dòng nào trong container hay không. Nếu có, hãy tách thông số này thành một mảng, sau đó lặp lại các dòng, gọi controller.enqueue() để gửi các dòng đã phân tích cú pháp ra ngoài.

script.js - LineBreakTransformer.transform()

// CODELAB: Handle incoming chunk
this.container += chunk;
const lines = this.container.split('\r\n');
this.container = lines.pop();
lines.forEach(line => controller.enqueue(line));

Khi luồng bị đóng, chúng ta chỉ cần đẩy mọi dữ liệu còn lại trong vùng chứa ra bằng enqueue.

script.js - LineBreakTransformer.flush()

// CODELAB: Flush the stream.
controller.enqueue(this.container);

Cuối cùng, chúng ta cần chuyển luồng đến thông qua LineBreakTransformer mới. Luồng đầu vào ban đầu của chúng ta chỉ được dẫn qua TextDecoderStream, vì vậy, chúng ta cần thêm pipeThrough bổ sung để dẫn nó qua LineBreakTransformer mới.

script.js - connect()

// CODELAB: Add code to read the stream here.
let decoder = new TextDecoderStream();
inputDone = port.readable.pipeTo(decoder.writable);
inputStream = decoder.readable
  .pipeThrough(new TransformStream(new LineBreakTransformer()));

Thử nào

Giờ đây, khi bạn nhấn một trong các nút micro:bit, dữ liệu đã in sẽ được trả về trên một dòng.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy một nụ cười xuất hiện trên ma trận LED micro:bit.
  5. Nhấn các nút trên micro:bit và xác minh rằng bạn thấy giống như sau:

eead3553d29ee581.png

Biến đổi luồng bằng JSONTransformer

Chúng ta có thể thử phân tích cú pháp chuỗi thành JSON trong readLoop. Tuy nhiên, hãy tạo một trình biến đổi JSON rất đơn giản để chuyển đổi dữ liệu thành đối tượng JSON. Nếu dữ liệu không phải là JSON hợp lệ, bạn chỉ cần trả về kết quả.

script.js - JSONTransformer.transform

// CODELAB: Attempt to parse JSON content
try {
  controller.enqueue(JSON.parse(chunk));
} catch (e) {
  controller.enqueue(chunk);
}

Tiếp theo, hãy truyền luồng qua JSONTransformer sau khi đã truyền qua LineBreakTransformer. Điều này cho phép chúng ta đơn giản hoá JSONTransformer vì biết rằng JSON sẽ chỉ được gửi trên một dòng.

script.js - connect

// CODELAB: Add code to read the stream here.
let decoder = new TextDecoderStream();
inputDone = port.readable.pipeTo(decoder.writable);
inputStream = decoder.readable
  .pipeThrough(new TransformStream(new LineBreakTransformer()))
  .pipeThrough(new TransformStream(new JSONTransformer()));

Thử nào

Giờ đây, khi nhấn một trong các nút micro:bit, bạn sẽ thấy [object Object] được in trên trang.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy một nụ cười xuất hiện trên ma trận LED micro:bit.
  5. Nhấn các nút trên micro:bit và xác minh rằng bạn thấy giống như sau:

Phản hồi khi nhấn nút

Để phản hồi các lượt nhấn nút micro:bit, hãy cập nhật readLoop để kiểm tra xem dữ liệu đã nhận được có phải là object với thuộc tính button hay không. Sau đó, hãy gọi buttonPushed để xử lý thao tác nhấn nút.

script.js - readLoop()

const { value, done } = await reader.read();
if (value && value.button) {
  buttonPushed(value);
} else {
  log.textContent += value + '\n';
}

Khi bạn nhấn nút micro:bit, màn hình trên ma trận LED sẽ thay đổi. Sử dụng mã sau để đặt ma trận:

script.js - buttonPushed()

// CODELAB: micro:bit button press handler
if (butEvt.button === 'BTN1') {
  divLeftBut.classList.toggle('pressed', butEvt.pressed);
  if (butEvt.pressed) {
    drawGrid(GRID_HAPPY);
    sendGrid();
  }
  return;
}
if (butEvt.button === 'BTN2') {
  divRightBut.classList.toggle('pressed', butEvt.pressed);
  if (butEvt.pressed) {
    drawGrid(GRID_SAD);
    sendGrid();
  }
}

Thử nào

Giờ đây, khi nhấn một trong các nút micro:bit, ma trận đèn LED sẽ thay đổi thành mặt vui hoặc mặt buồn.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy một nụ cười xuất hiện trên ma trận LED micro:bit.
  5. Nhấn các nút trên micro:bit và kiểm tra để đảm bảo ma trận đèn LED thay đổi.

8. Đóng cổng nối tiếp

Bước cuối cùng là kết nối chức năng ngắt kết nối để đóng cổng khi người dùng hoàn tất.

Đóng cổng khi người dùng nhấp vào nút Kết nối/Ngắt kết nối

Khi người dùng nhấp vào nút Kết nối/Ngắt kết nối, chúng ta cần đóng kết nối. Nếu cổng này đã mở, hãy gọi disconnect() và cập nhật giao diện người dùng để cho biết trang không còn được kết nối với thiết bị nối tiếp nữa.

script.js - clickConnect()

// CODELAB: Add disconnect code here.
if (port) {
  await disconnect();
  toggleUIConnected(false);
  return;
}

Đóng luồng và cổng

Trong hàm disconnect, chúng ta cần đóng luồng đầu vào, đóng luồng đầu ra và đóng cổng. Để đóng luồng dữ liệu đầu vào, hãy gọi reader.cancel(). Lệnh gọi đến cancel không đồng bộ, vì vậy chúng ta cần sử dụng await để chờ lệnh gọi này hoàn tất:

script.js - disconnect()

// CODELAB: Close the input stream (reader).
if (reader) {
  await reader.cancel();
  await inputDone.catch(() => {});
  reader = null;
  inputDone = null;
}

Để đóng luồng đầu ra, hãy lấy writer, gọi close() và chờ đối tượng outputDone đóng:

script.js - disconnect()

// CODELAB: Close the output stream.
if (outputStream) {
  await outputStream.getWriter().close();
  await outputDone;
  outputStream = null;
  outputDone = null;
}

Cuối cùng, hãy đóng cổng nối tiếp và chờ cổng này đóng lại:

script.js - disconnect()

// CODELAB: Close the port.
await port.close();
port = null;

Thử nào

Giờ đây, bạn có thể tuỳ ý mở và đóng cổng nối tiếp.

  1. Tải lại trang.
  2. Nhấp vào nút Kết nối.
  3. Trong hộp thoại trình chọn Cổng nối tiếp, hãy chọn thiết bị BBC micro:bit và nhấp vào Kết nối.
  4. Bạn sẽ thấy một nụ cười xuất hiện trên ma trận LED micro:bit
  5. Nhấn nút Ngắt kết nối và xác minh rằng ma trận LED tắt và không có lỗi trong bảng điều khiển.

9. Xin chúc mừng

Xin chúc mừng! Bạn đã tạo thành công ứng dụng web đầu tiên sử dụng Web Serial API.

Hãy theo dõi https://goo.gle/fugu-api-tracker để biết thông tin mới nhất về Web Serial API cũng như tất cả các tính năng web mới, thú vị khác mà nhóm Chrome đang nghiên cứu.