对于嵌入式工程师来说,串口工具在开发和调试过程中必不可少的利器。工具能帮助我们发送和接收串行数据,进行设备通信和调试。通过串口工具,工程师可以实时监控串口数据,查看设备是否正常工作,同时也可以通过发送特定的命令来测试设备的反应。
传统的电脑应用-串口助手,虽然也能满足这些需求,但它们在便捷性上往往受到限制。它需要去网上下载,有些还需要安装。
相比之下,在线串口助手的出现为嵌入式工程师带来了福音。它无需安装、无需配置,只需通过浏览器即可使用。此外,在线串口助手通常提供更为直观的界面和易于操作的功能,帮助工程师更高效地进行工作。
博主最近看到网上有开发者--老大哥,开源了一个在线串口工具,其链接:https://gitee.com/itldg/web-serial-debug,其开源协议:Apache License 2.0。
通过上面的启发,博主想着也写一个网页(R-WebEmbedded),并集成该开源软件,方便大家使用。
在开发在线串口助手之前,就必须先了解什么是web serial api。
检查浏览器是否支持Web Serial API,有些浏览器可能不支持该功能,可以选择Edge或Chrome浏览器。
if (!('serial' in navigator)) {
alert('当前浏览器不支持串口操作,请更换Edge或Chrome浏览器')
}
// 提示用户选择一个串口。
const serialPort = await navigator.serial.requestPort();
// 获取用户之前授予该网站访问权限的所有串口。
const serialPort = await navigator.serial.getPorts();
document.getElementById('serial-select-port').addEventListener('click', async () => {
try {
await navigator.serial.requestPort().then(async (port) => {
serialPort?.close()
await serialPort?.forget()
serialPort = port
serialStatuChange(true)
})
} catch (e) {
console.error('获取串口权限出错' + e.toString())
}
})
dataBits:每帧的数据位数(7或8)。
stopBits:一帧结束时的停止位数(1或2)。
parity:校验模式,可以是none,偶数,奇数。
bufferSize:应该创建的读写缓冲区大小(必须小于16MB)。
flowControl:流控模式(none或hardware)。
async function closeSerial() {
if (serialOpen) {
serialOpen = false
reader?.cancel()
serialToggle.innerHTML = '打开串口'
disabledOptions(false)
}
}
async function readData() {
while (serialOpen && serialPort.readable) {
reader = serialPort.readable.getReader()
try {
while (true) {
const { value, done } = await reader.read()
if (done) {
break
}
dataReceived(value)
}
} catch (error) {
} finally {
reader.releaseLock()
}
}
await serialPort.close()
}
async function readData() {
while (serialOpen && serialPort.readable) {
reader = serialPort.readable.getReader()
try {
while (true) {
const { value, done } = await reader.read()
if (done) {
break
}
dataReceived(value)
}
} catch (error) {
} finally {
reader.releaseLock()
}
}
await serialPort.close()
}
async function sendHex(hex) {
const value = hex.replace(/\s+/g, '')
if (/^[0-9A-Fa-f]+$/.test(value) && value.length % 2 === 0) {
let data = []
for (let i = 0; i < value.length; i = i + 2) {
data.push(parseInt(value.substring(i, i + 2), 16))
}
await writeData(Uint8Array.from(data))
} else {
addLogErr('HEX格式错误:' + hex)
}
}
async function sendText(text) {
const encoder = new TextEncoder()
writeData(encoder.encode(text))
}
async function writeData(data) {
if (!serialPort || !serialPort.writable) {
addLogErr('请先打开串口再发送数据')
return
}
const writer = serialPort.writable.getWriter()
if (toolOptions.addCRLF) {
data = new Uint8Array([...data, 0x0d, 0x0a])
}
await writer.write(data)
writer.releaseLock()
addLog(data, false)
}
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!