C#でArduinoと通信

みなさんもVisual C#でArduinoと通信してみたいということがあると思います。 ここではシリアルポートを開いたのち、C#からのデータを受け取り、Arduinoが文字列を送り返す、というプログラムを作ります。
参考:C#でフォームアプリケーション(当サイト)
C#でシリアル通信を行う(外部サイト)

SerialPortコントロール
ツールボックスから「SerialPort」コントロールをフォームへドラッグ&ドロップします。

SerialPortコントロールのプロパティ
すると、[デザイン]タブの下にコントロールが追加されます。

他のコントロール
今回はArduinoの接続されているCOMポートを「コンボボックス」から選択し、「ボタン」を押すと通信を開始、受け取った文字列を「ラベル」2に表示する仕様にしたいと思います。
コンボボックスのプロパティ、「Item」には、「COM1 ~ COM5」の文字列を入力しておきます。
これらアイテムには0~行数-1の数値が割り振られます。
ボタンには、「Click」したときに発生するイベントを設定しておきます。

serialPortのイベント
下のシリアルポートオブジェクトを選択して、こいつにもイベントを設定します。
ここには、シリアルポート接続機器からデータを受け取った時に発生するイベント、「DataReceived」メソッドを設定します。
コード側で、ボタンのClickイベントとシリアルポートのDataReceivedイベントの中身をそれぞれ記入します。

using System;
using System.Windows.Forms;
using System.Threading;

namespace arduino_sample1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void start_serial(object sender, EventArgs e)
        {
            if (button1.Enabled)
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();	// 選択されたCOMをポート名に設定
                serialPort1.Open();	// ポートを開く
                serialPort1.Write("A");	// ポートへ適当な文字列を書き込む
                button1.Enabled = false;	// ボタンを押した直後、利用不能にしておく
            }
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                string data = serialPort1.ReadExisting();	// ポートから文字列を受信する
                if (!string.IsNullOrEmpty(data))
                {
                    Invoke((MethodInvoker)(() =>	// 受信用スレッドから切り替えてデータを書き込む
                    {
                        label2.Text = data;	// ラベルを受信した文字列へ変更
                        Thread.Sleep(1);
                        button1.Enabled = true;	// ボタンを押せるようにしておく
                    }));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
C#側はこれで準備OK。今度はArduinoへ下記のコードを書き込みます。
int inByte = 0;
int SA = 0;

void setup() {
	Serial.begin(9600);
}

void loop() {
	SA = Serial.available();	// シリアルポートにデータがあるかを確認
	if(SA > 0){
		inByte = Serial.read();	// データを読み込む
		if(inByte==65){
			Serial.print("Done.");	// ASCIIコードで"A"だった場合に"Done."を送信
			delay(1000);	// 通信用の待機時間
		}
	}
}
さあこれをArduinoへ書き込んだところで、C#も走らせてみましょう。

serialPortのイベント
ここではArduinoの接続ポートであるCOM3をコンボボックスから選択し、ボタンをクリックします。

serialPortのイベント
中央下のラベル表示が「Done.」に変化しました。簡単ですね。

↑ PAGE TOP