シリアル通信入門 (RS-232C/422/485)


この記事では、シリアル通信で文字列を送受信するサンプルプログラムを実行することを目標とし、そのために必要な道具や設定を説明します。

RS-232C/422/485 シリアル通信とは。基礎知識、用語集|コンテック

準備

  1. 道具の用意

    まず、以下の道具を用意します。

    • USB シリアル変換ケーブル × 2本
    • シリアル クロスケーブル



    2本の USB シリアル変換ケーブルをシリアルクロスケーブルで接続し、残りの端子を USB ポートに挿します。これにより1台の PC に2つの仮想 COM ポートが作成され、送受信のテストが出来るようになります。

    デバイスマネージャーで COM ポートの番号を確認・変更できます。

    Device Manager Com Port

  2. com0com

    Windows の場合、上記の道具を用意する代わりに、com0com というフリーソフトを使う方法もあります。com0com を使うと2つの仮想 COM ポートが相互に接続された状態で作成されます。

    最近の Windows は、署名されたドライバでないと普通にインストールすることが出来ません。com0com のバージョン 2.2.2.0 のインストーラは署名されているので、インストールが楽です。

    com0com 2.2.2.0

    com0com をインストールした直後は、作成された仮想 COM ポートの名前が CNCA0 や CNCB0 となっています。この名前は com0com の Setup で変更することもできます。

    com0com Setup

    com0com で作成された仮想 COM ポートの番号もデバイスマネージャーで確認できます。

    Device Manager com0com

  3. COM ポート一覧の確認

    以下の記事で紹介されているスクリプトを使うと、利用可能な COM ポートの一覧をデバイスマネージャーを開かずに確認できます。

    利用可能なシリアルポート一覧を取得する方法(Windows)

シリアル通信でメッセージを送受信

以下で使用している gem の serialport は挙動不審なことがあります。
C# の SerialPort クラスはとても安定しているのでお勧めです。

  1. Ruby のインストール

    以下の Ruby のサンプルコードを動かすには、あらかじめ Ruby をインストールしておく必要があります。

    RubyInstaller for Windows

  2. Gem serialport

    このサンプルコードは serialport という gem を使っているので、それをあらかじめインストールしておく必要があります。

    gem install serialport

    Windows の場合、DevKit がインストールされていないと上記のコマンドはエラーになります。その場合はDevKit をインストールしてください。

    DevKit をインストールしてもエラーが発生する場合はこちらを参考にしてください。
    Windowsでgem installするとSSLエラーが出る場合の解決策 – Qiita

    参考:
  3. サンプルコード

    シリアル通信でメッセージを送受信する Ruby スクリプトです。

    send_receive_serialport.rb

    require 'serialport'

    if ARGV.length.zero?
        $stderr.puts "COMポートの番号を指定して実行してください。"
        exit
    end

    port = ARGV.first
    puts "COMポート: #{port}"

    Signal.trap(:INT) { exit }

    SerialPort.open(port, 19200, 8, 1, SerialPort::NONE) do |serial|
        serial.read_timeout = -1

        # 受信スレッド
        thread = Thread.new do
            loop do
                sleep 0.05
                if recv = serial.read
                    print recv
                end
            end
        end

        loop do
            serial.write $stdin.gets
        end
    end

    コマンドプロンプトを2つ起動し、クロスシリアルケーブルで接続された COM ポートの名前をそれぞれコマンドライン引数に指定して実行します。

    > send_receive_serialport.rb COM4
    > send_receive_serialport.rb COM5

    コマンドプロンプト上に入力した文字がもう一方のコマンドプロンプトに送信されます。

カテゴリー: 記事 タグ: , パーマリンク

コメントを残す