組み込みソフトウェアの開発の際には、シリアル通信機能を使用することが多いです。シリアル通信を外部機器とのやり取るをする上で大切な機能です。
デバック作業をする際にもとても役立ちます。PC側はOSI参照モデルの物理層に位置づけられるRS232C通信を使用します。
それでは、早速、アプリケーションを作成しましょう。ボタンやテキストボックスの作成方法は、下記のページを参考にして下さい。
下記のようなアプリケーションを作成します。
プロパティのテキスト欄を編集して、ボタンやグループボックスの表示を編集できます。
プロパティのNameを編集して、ボタンやテキストボックスに識別子を定義します。
下記にボタンやテキストボックスの識別子を記載しておきますので、参考にして下さい。
Name | Text |
groupBox1 | ポート |
cmbBox_Port | 空欄 |
Btn_Connect | 接続 |
Btn_Disconnect | 解除 |
groupBox2 | 送信 |
txtBox_Send | 空欄 |
Btn_Send | 送信 |
groupBox3 | 受信 |
Btn_Receive | 受信 |
txtBox_Receive | 空欄 |
今回、ポイントとなってくるのが下記の作業になります。ツールボックスよりSerialPortをダブルクリックして追加します。ダイアログの下の方にserialPort1が追加されています。このserialPort1を使用して、RS232通信を行います。
まずは、ダイアログの作成までできました。各種ボタンやテキストボックスの動作を定義していきます。まずは、ダイアログをロードしたときの動作です。
private void SerialForm_Load(object sender, EventArgs e) { string[] PortList = SerialPort.GetPortNames(); cmbBox_Port.Items.Clear(); foreach (string PortName in PortList) { cmbBox_Port.Items.Add(PortName); } }
SerialPortクラスのメソッド、GetPortNamesで利用可能なシリアルポート名を取得します。取得したシリアルポート名をcmbBox_Portコンボボックスの値に追加します。これで、アプリケーション実行時にシリアルポートを選択できます。次は接続ボタンの動作です。
private void Btn_Connect_Click(object sender, EventArgs e) { if (serialPort1.IsOpen == false) { if (cmbBox_Port.Items.Count <= 0) { return; } serialPort1.PortName = cmbBox_Port.SelectedItem.ToString(); serialPort1.BaudRate = 9600; serialPort1.DataBits = 8; serialPort1.Parity = Parity.None; serialPort1.StopBits = StopBits.One; serialPort1.Handshake = Handshake.None; serialPort1.Encoding = Encoding.GetEncoding(932); serialPort1.ReadTimeout = 3000; try { serialPort1.Open(); MessageBox.Show("接続しました。"); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } } return; }
ダイアログ作成時に追加しましたserialPort1のプロパティに各種パラメータを設定しています。OpenメソッドでRS232通信(シリアル通信)を開始します。次は解除ボタンの動作です。
private void Btn_Disconnect_Click(object sender, EventArgs e) { if (serialPort1.IsOpen == true) { serialPort1.Close(); MessageBox.Show("切断しました。"); } return; }
CloseメソッドでRS232通信(シリアル通信)を終了します。次は、送信ボタンの動作の定義です。
private void Btn_Send_Click(object sender, EventArgs e) { if (serialPort1.IsOpen == false) { MessageBox.Show("ポートが開かれていません。"); return; } if (string.IsNullOrEmpty(txtBox_Send.Text) == true) { MessageBox.Show("テキストボックスが空欄です"); return; } try { serialPort1.Write(txtBox_Send.Text + "¥r"); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } return; }
WriteメソッドでPC側から相手側に文字列を1文字ずつ送信します。私の作成する組み込みソフトウェアは区切り文字に”¥r”を使用する使用であるので、Writeメソッドの引数文字列の最後の”¥r”を追加しています。受信ボタンの動作の定義です。
private void Btn_Receive_Click(object sender, EventArgs e) { string sReceive = ""; if (serialPort1.IsOpen == false) { MessageBox.Show("ポートが開かれていません。"); return; } try { sReceive = serialPort1.ReadTo("¥r"); sReceive = sReceive + "¥r¥n"; } catch (Exception ex) { MessageBox.Show(ex.Message); return; } txtBox_Receive.Text = txtBox_Receive.Text + sReceive; }
ReadToメソッドで指定した文字までの文字列を受信します。タイムアウト時間は、接続ボタンを押した際に、3000msecと指定してあるので、3秒以上たっても指定した文字を受信しない場合は、タイムアウトします。これにてC#言語によるRS232通信の完成です。
相手側はArduinoで作しました。PC側からSendを送信すると、ArduinoのLED(L)が点灯します。PC側の受信ボタンを押すとOKを受信します。また、Arduinoに関しても紹介しようと思います。