シリアル通信モニタを作ってみる(on VS for Mac) (1)

環境は Visual Studio Community 2017 for Mac とします。Windows 上の通常の Visual Studio でも動くでしょう。 使用言語は C# です。

プロジェクト・ソリューションの作成

とりあえずということでコンソールアプリケーションを作成します。ここではプロジェクト名、ソリューション名ともに ser にしました。

使用する SerialPort クラス

C 言語でうなりながら泥臭く作っていくのが個人的には好きなのですが、正直 termios の概要を読んでもよくわからなかったということで、今回は C# の SerialPort クラスに手助けをしてもらいながらプログラムを書いていこうと思います。

このクラスは MSDN に説明書きがありますので、こちらを参照しながら組み立てることとします。

プロジェクトの設定

VS for Mac デフォルトの設定では、デバッグ時に Terminal.app が起動してしまいます。しかしながらこれでは正常に動作しないので、IDE 内部でプログラムを実行するようにします。

まず、左ペインのファイル一覧の内、プロジェクトを選択して右クリック。オプションを開きます。

そして実行のところから「外部コンソールで起動する」のチェックを外してください。これで IDE 内部で動くようになるでしょう。

シリアルポート名を表示するアプリ作成

イキナリやろうとしても無理がありそうだったので、とりあえず今回はポート名表示のみのアプリを作成したいと思います。

using System;
using System.IO.Ports; // SerialPortに必要

namespace ser {
    class MainClass {
        private static SerialPort serial; // 今回は使わない
        public static void Main(string[] args) { // Main関数
            serial = new SerialPort(); // serialのインスタンス化
            string[] ports = SerialPort.GetPortNames(); // ポート名を取得 -> 文字列型変数に格納
            foreach (string port in ports) { // portsから要素を1つづつ取り出す
                if (port.Contains("tty.")) { // portに"tty."がふくまれたら
                    Console.WriteLine(port); // ポート名表示
                }
            }
        }
    }
}

とりあえずこんな感じで作ってみました。過去に少し C# をやっていたので案外サクッと出来てしまいました。やっててよかった。

SerialPort クラスでは各種シリアル通信を行ってくれます。基本的な使用法はインスタンス化してそこに各種プロパティ値を代入、メソッド実行となっていくのですが、今回はインスタンス化する意味はありません。ポート名のリストを取得するのは別にインスタンス化せずとも、SerialPort クラスの static メソッドを呼べばいいということになります。

さらにこのリストを全て表示させようとしても、/dev/tty1 等、今回明らかに目的としていないポート名がいろいろと表示されてしまうので、tty. の含んだもののみを出力の対象としました。実行結果はこんな感じ↓

Loaded assembly: /Users/yuki/Projects/ser/ser/bin/Debug/ser.exe
Loaded assembly: /Library/Frameworks/Mono.framework/Versions/5.0.1/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll [External]
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.QCY-QY19-CSRGAIA
/dev/tty.usbmodem1412

ちゃんと3つ出てきましたね。ちなみに一番下の /dev/tty.usbmodem1412 がターゲットとして接続したいマイコンです。という訳で次回はとりあえず読み込んで出力というアプリにしていきたいと思います。なお、このファイルを配布したい時は「▶」ボタン右側の Debug を Release にして実行してください。

プログラムの実行法と場所

Release で作成したプログラムを配布する際は ~/Projects/ser/ser/bin//Release/ser.exe に実行ファイルがあるので、これを配布します。なおこれは mono 必須ですので、実行時には mono ser.exe とする必要があります。

とりあえず SerialPort を使ってみたぞ!ということを体験(?)してみました。しかしながらシリアル通信らしいことはまだ一切やっていません。次回はデータの送信プログラムを作ってみることにします。

参考