トップ > Tech > CSharp > SerialPort

SerialPort

シリアル通信を行う System.IO.Ports.SerialPort クラスの覚え書き

初期化

SerialPort port = new SerialPort();
// ↓ COM 番号
port.PortName = "COM1";
// ↓ 通信仕様
port.Handshake = Handshake.RequestToSend;
port.BaudRate = 4800;
port.Parity = Parity.None;
port.StopBits = StopBits.Two;
port.DataBits = 8;
// ↓ タイムアウトとバッファサイズ指定
port.WriteTimeout = 1000;
port.ReadTimeout = 1000;
port.WriteBufferSize = 1024;
port.ReadBufferSize = 1024;
// ↓ 通常 false
port.RtsEnable = false;
port.DtrEnable = false;
// ↓ 何バイト受信したら DataReceived イベントを発生させるか
port.ReceivedBytesThreshold = int.MaxValue;

Tips

  • ReceivedBytesThreshold プロパティは DataReceived イベントを発生させる受信バイト数を指定する(らしい)が、これが小さい値だとイベントハンドラを設定していなくても、やたらイベント処理が発生する(らしい)。このため、受信が遅い。
    同期受信の場合は DataReceived イベントが発生する必要がないので、int の最大値に設定して、イベントが発生しないようにしたところ、速度の向上が確認できた。

同期送受信

// ポートオープン
port.Open();

// 送信
port.Write(data, 0, data.Length);

// 最初のデータがくるまで待つ
while (port.BytesToRead == 0)
{
    // ここにタイムアウト処理
    
    // ちょっと他人のことも考える
    Thread.Sleep(0);
}

// 受信バッファ
List<byte> received = new List<byte>();

// 受信
while (port.BytesToRead > 0)
{
    // 1 バイト受信してバッファに格納
    received.Add((byte)port.ReadByte());
    // ここに終了コードなら抜ける処理
    // ここにタイムアウト処理
}

// 配列に変換
byte[] receivedData = received.ToArray();

// ポートクローズ
port.Close();

Tips

  • この例では例外処理は省いてある。
  • BytesToRead で受信可能なバイト数を確認できる。
  • Open, Close は連続して送受信を行う場合以外は毎度行ったほうがよい。
    • Close せずにしばらく放置し、再度通信すると受信が非常に遅くなったり、受信にかかる時間が不安定になったりする。
    • Open, Close を都度行った場合は、受信速度は安定する。
    • ただし、通信相手に依存する可能性がある。
    • Open には Pentium4 2.4CGHz のマシンで 600[msec] 程度かかる。
(2010/03/25 17:26:25)
34277
プロフィール

Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。 好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。 詳しくは Web mixi で。

Bookmark and Share