次の JavaScript コードが目的の Modbus 信号を生成しないことを証明できました。
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>examplepage</title>
<script>
async function start()
{
// Prompt user to select any serial port.
const port = await navigator.serial.requestPort();
// Wait for the serial port to open.
await port.open({ baudRate: 57600, dataBits: 8, stopBits: 1, ParityType: "even"});
//Übermittle Anfrage um Inhalt von Register anzufordern
const writer = port.writable.getWriter();
//const data = new Uint8Array([0x01, 0x03, 0x00, 0x01, 0x00, 0x02, 0x95, 0xCB]); // request for register
const data = new Uint8Array([0x11, 0x01, 0x00, 0x13, 0x00, 0x25, 0x0E, 0x84]);
await writer.write(data);
// Allow the serial port to be closed later.
writer.releaseLock();
// empfangen
const reader = port.readable.getReader();
// Listen to data coming from the serial device.
while (true) {
const { value, done } = await reader.read();
if (done) {
// Allow the serial port to be closed later.
reader.releaseLock();
break;
}
// value is a Uint8Array.
console.log(value);
}
}
if ("serial" in navigator) {
alert("Your browser supports Web Serial API!");
}
else {alert("Your browser does not support Web Serial API, the latest version of Google Chrome is recommended!");};
</script>
</head>
<body>
<button onclick="start()">Click me</button>
</body>
</html>
対応する COM ポートをコンピュータの別の COM ポートに接続しました。反対側では、HTerm がリッスンしています。HTerm は、11 01 00 13 00 25 0E 84 の代わりに 11 40 13 25 88 を受信します。HTerm で目的の信号を送信すると、正しい信号が得られます。その結果、ハードウェアは正常に動作しています。
間違ったコマンド
を受信
HTerm によって目的の modbus コマンドを送信 HTerm によって送信された目的のコマンドを
受信
ここで何がうまくいかないのですか?コードをどのように調整する必要がありますか? または、Google Chrome にバグがありますか?