▼シリアルポートメモ▼
シリアルポート


シリアルポート
シリアル転送方式でコンピュータ本体と周辺機器を接続するインターフェース。


情報源


サイト
プチロボXの通信プロトコル仕様
電光掲示板「NJE-106」の通信プロトコル仕様
浅草ギ研 Visual C# 2005 のシリアル通信機能を使ってみる


はじめてのシリアルポートの制御


例としてプチロボXのモーターの1つの回転角度を指定する命令するプログラムを作成する。
他のシリアルポート接続機器に対応したい時は、シリアルポートのプロパティと送信するバイト配列の設定を変更するだけでよい。


ソースコードはここからダウンロード。



開発環境を整える
  1. Visual C# Express Edition 2008」をダウンロードしてインストール。
  2. プロジェクトを「SerialEx」という名前で作成。
  3. 「Form1.cs」を「SerialForm.cs」とう名前に変更。


デザインの編集
ツールボックスから「Button」と「SerialPort」を1つずつ追加。



フォーム「SerialForm」
プロパティ 説明
Text SerialEx フォームのタイトル

ボタン「btnSend」
プロパティ 説明
Text 送信 ボタンのラベル

ボタンにはイベントも追加する。
イベント メソッド名 説明
Click btnSend_Click ボタンクリック時のイベント処理


シリアルポート「serialPort」
プロパティ 説明
BandRate 4800 通信速度。
通常1200,2400,9600,19200,38400bps。
DataBits 8 データビット。
通常8bit。
Parity None パリティ。
ハードの性能の向上により、現在ではあまり使われなくなった。
odd:奇数パリティ、even:偶数パリティ、Mark:マーク状態、 Spece:スペース状態。
StopBits One ストップビット。
通信は8bitの前後にスタートとストップを表すのに各1bit使用。
ハードウェア性能の向上により、現在では通常1bit。
そのため、1byteの送信に10bit利用することになる。
Handshake None ハンドシェイク。
相手の通信準備ができているかを確認するためのフロー制御。
ハードウェア性能の向上により、現在ではあまり使われなくなった。
PortName COM1 ポート名。
COM1のように記述(数字は変化)。
Windowsのデバイスマネージャで番号を確認できる。
RtsEnable True RTSの有効化。
フロー制御の細かい設定。
あまり利用することはないがプチロボXでは必要。


ソースコードの記述
プロトコル仕様にそってバイト配列を生成し、SerialPortのOpen()メソッド、Write()メソッド、Close()メソッドで命令を送信。

SerialForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SerialEx {
    public partial class SerialForm : Form {
        //コンストラクタ
        public SerialForm() {
            InitializeComponent();
        }

        //送信ボタンクリックのイベント処理
        private void btnSend_Click(object sender, EventArgs e) {
            //モーター0を回転位置100
            SendCommand(221,100);
        }

        //プチロボXへの命令送信
        private void SendCommand(int moterIdx,int rotation) {
            try {
                byte[] result=new byte[4];
                result[0]=(byte)253;
                result[1]=(byte)moterIdx;
                result[2]=(byte)rotation;
                result[3]=(byte)(moterIdx-220+rotation);
                serialPort.Open();
                serialPort.Write(result,0,result.Length);
                serialPort.Close();
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            }
        }
    }
}


−戻る−