スタートガイド

Estimated reading time: 3 minutes

RS-232C コマンドを serial_control.js と Node.js で送信する方法を説明します。

用意するもの

  • ディスプレイ
  • PC
  • シリアルケーブル(USB to 3.5 mm ミニプラグ TTL シリアルケーブルなど)

準備

ディスプレイをセットアップする

  • ディスプレイと PC をシリアルケーブルで接続します。
  • RS232C 制御設定をシリアル端子経由に設定します。
      1. [ホーム] 設定
      2. RS232C制御設定
      3. シリアル端子経由
  • プロモードツールを使用して通常モードまたはプロモードに切り替えます。

PC をセットアップする

  • PC に Node.js (v6.x以降) と npm をインストールします。
  • node-serialport をインストールします。
    • C:\>npm install serialport -g
  • serial_control.zip をダウンロードしてください。
  • 特定のフォルダに zip ファイルを解凍します (例: C:\serial_control>)

実行

  1. 引数なしで ‘node serial_control.js’ を実行すると、シリアルポート名のリストを取得できます。
    C:\serial_control>node serial_control.js
    Usage: node serial_control.js [PORTNAME] [CMDNAME]
    .
    Commands:
      auto_wide_off
      auto_wide_on
      auto_wide_toggle
      ...
      (*snip*)
      ...
    .
    Serial Ports:
      [PORTNAME]                    [VENDOR]
      COM1                          (*snip*)
      COM2                          (*snip*)
      COM3                          (*snip*)
    
  2. power_off コマンドを送信すると、ディスプレイの電源が切れます。
    C:\serial_control>node serial_control.js COM1 power_off
    Port 'COM1' opened.
      Request[0]=0x8C
      Request[1]=0x00
      Request[2]=0x00
      Request[3]=0x02
      Request[4]=0x00
      Request[5]=0x8E
    Command 'power_off' written.
      Response[0]=0x70: ANSWER
      Response[1]=0x00: Completed (Normal)
      Response[2]=0x70: Checksum matched
    
  3. power_get コマンドを送信すると、Return Data [0] に 0x00 (Power Off) が返されます。
    C:\serial_control>node serial_control.js COM1 power_get
    Port 'COM1' opened.
      Request[0]=0x83
      Request[1]=0x00
      Request[2]=0x00
      Request[3]=0xFF
      Request[4]=0xFF
      Request[5]=0x81
    Command 'power_get' written.
      Response[0]=0x70: ANSWER
      Response[1]=0x00: Completed (Normal)
      Response[2]=0x02: Return Data Size
      Response[3]=0x00: Return Data[0]
      Response[4]=0x72: Checksum matched
    
  4. power_on コマンドを送信すると、ディスプレイの電源が入ります。
    C:\serial_control>node serial_control.js COM1 power_on
    Port 'COM1' opened.
      Request[0]=0x8C
      Request[1]=0x00
      Request[2]=0x00
      Request[3]=0x02
      Request[4]=0x01
      Request[5]=0x8F
    Command 'power_on' written.
      Response[0]=0x70: ANSWER
      Response[1]=0x00: Completed (Normal)
      Response[2]=0x70: Checksum matched
    
  5. 再度 power_get コマンドを送信すると、Return Data [0] に 0x01 (Power On) が返されます。
    C:\serial_control>node serial_control.js COM1 power_get
    Port 'COM1' opened.
      Request[0]=0x83
      Request[1]=0x00
      Request[2]=0x00
      Request[3]=0xFF
      Request[4]=0xFF
      Request[5]=0x81
    Command 'power_get' written.
      Response[0]=0x70: ANSWER
      Response[1]=0x00: Completed (Normal)
      Response[2]=0x02: Return Data Size
      Response[3]=0x01: Return Data[0]
      Response[4]=0x73: Checksum matched
    

サンプルコード

  • serial_control.js からの抜粋:
    const serialport = require("serialport");
    
    const commands = {
      "power_on":                        [0x8C, 0x00, 0x00, 0x02, 0x01],
      "power_off":                       [0x8C, 0x00, 0x00, 0x02, 0x00],
      "power_get":                       [0x83, 0x00, 0x00, 0xFF, 0xFF],
    ...
    (*snip*)
    ...
    
    const sp = new serialport(portname, {
      baudRate: 9600,
      dataBits: 8,
      parity: 'none',
      stopBits: 1,
      flowControl: false,
      parser: new serialport.parsers.Readline("\n")
    });
    
    sp.on("data", function(data) {
      for (var i = 0; i < data.length; i++) {
        if (resp_index == 0) { // HEADER
          if (data[i] == 0x70) {
            resp_log(resp_index, data[i], 'ANSWER');
          } else {
            sp.close();
            errorlevel = EL_HEADER_UNKNOWN;
            return resp_log(resp_index, data[i], 'Error: Header is not ANSWER(0x70), ' + toHex(data[i]));
          }
        } else if (resp_index == 1) { // ANSWER
          resp_answer = data[i];
          var answer = answers[data[i]];
          if (answer !== undefined) {
            resp_log(resp_index, data[i], answer);
            if (resp_answer !== 0x00) {
              errorlevel = EL_ANSWER_ERROR;
            }
          } else {
            sp.close();
            errorlevel = EL_ANSWER_UNKNOWN;
            return resp_log(resp_index, data[i], 'Error: Unknown answer, ' + toHex(data[i]));
          }
        } else {
          if (cmd_type == 0x8C) { // Response to Control Request
            if (resp_index == 2) {
              return checkChecksum(sp, data[i], resp_checksum, resp_index);
            }
          } else if (cmd_type == 0x83) {  // Response to Query Request
            if (resp_index == 2) {
              if (resp_answer == 0x00) {
                resp_return_data_size = data[i];
                resp_return_data_size -= 1;
                resp_log(resp_index, data[i], 'Return Data Size');
              } else {
                return checkChecksum(sp, data[i], resp_checksum, resp_index);
              }
            } else if (resp_index >= 3 && resp_index < (2 + resp_return_data_size)) {
              resp_log(resp_index, data[i], 'Return Data[' + (resp_index - 3) + ']');
            } else if (resp_index == (2 + resp_return_data_size)) {
              return checkChecksum(sp, data[i], resp_checksum, resp_index);
            }
          } else {
            sp.close();
            errorlevel = EL_CMD_TYPE_UNKNOWN;
            return resp_log(resp_index, data[i], 'Error: Unknown command type');
          }
        }
        resp_index += 1;
        resp_checksum += data[i];
      }
    });
    
    sp.on("open", function(err) {
      if (err) {
        errorlevel = EL_OPEN_ERROR;
        sp.close();
        return console.log("Error on open: " + err.message);
      } else {
        console.log("Port '" + portname + "' opened.");
        var buf = commands[cmdname];
        buf.push(0); // for checksum
        var sum = 0;
        for (var i = 0; i < buf.length; i++) {
          if (i == buf.length - 1) {
            buf[i] = sum;
          } else {
            sum += buf[i];
          }
          console.log("   Request[" + i + "]=" + toHex(buf[i]));
        }
        resp_index = 0
        cmd_type = buf[0];
        sp.write(buf, function(err) {
          if (err) {
            errorlevel = EL_WRITE_ERROR;
            sp.close();
            return console.log('Error on write: ', err.message);
          }
          console.log("Command '" + cmdname + "' written.");
        });
      }
    });
    
Last modified: 25 Dec 2019