環境は 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
を使ってみたぞ!ということを体験(?)してみました。しかしながらシリアル通信らしいことはまだ一切やっていません。次回はデータの送信プログラムを作ってみることにします。