この記事では、シリアル通信で文字列を送受信するサンプルプログラムを実行することを目標とし、そのために必要な道具や設定を説明します。
RS-232C/422/485 シリアル通信とは。基礎知識、用語集|コンテック
準備
道具の用意
まず、以下の道具を用意します。
- USB シリアル変換ケーブル × 2本
- シリアル クロスケーブル
2本の USB シリアル変換ケーブルをシリアルクロスケーブルで接続し、残りの端子を USB ポートに挿します。これにより1台の PC に2つの仮想 COM ポートが作成され、送受信のテストが出来るようになります。
デバイスマネージャーで COM ポートの番号を確認・変更できます。
com0com
Windows の場合、上記の道具を用意する代わりに、com0com というフリーソフトを使う方法もあります。com0com を使うと2つの仮想 COM ポートが相互に接続された状態で作成されます。
最近の Windows は、署名されたドライバでないと普通にインストールすることが出来ません。com0com のバージョン 2.2.2.0 のインストーラは署名されているので、インストールが楽です。
com0com をインストールした直後は、作成された仮想 COM ポートの名前が CNCA0 や CNCB0 となっています。この名前は com0com の Setup で変更することもできます。
com0com で作成された仮想 COM ポートの番号もデバイスマネージャーで確認できます。
COM ポート一覧の確認
以下の記事で紹介されているスクリプトを使うと、利用可能な COM ポートの一覧をデバイスマネージャーを開かずに確認できます。
シリアル通信でメッセージを送受信
※以下で使用している gem の serialport は挙動不審なことがあります。
C# の SerialPort クラスはとても安定しているのでお勧めです。
Ruby のインストール
以下の Ruby のサンプルコードを動かすには、あらかじめ Ruby をインストールしておく必要があります。
Gem serialport
このサンプルコードは serialport という gem を使っているので、それをあらかじめインストールしておく必要があります。
gem install serialport
※Windows の場合、DevKit がインストールされていないと上記のコマンドはエラーになります。その場合はDevKit をインストールしてください。
DevKit をインストールしてもエラーが発生する場合はこちらを参考にしてください。
参考:
Windowsでgem installするとSSLエラーが出る場合の解決策 - Qiitaサンプルコード
シリアル通信でメッセージを送受信する Ruby スクリプトです。
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
コマンドプロンプト上に入力した文字がもう一方のコマンドプロンプトに送信されます。