シリアルポートに信号を送ってみる

Visual C#を使って、PCのシリアルポートからPICに信号を送るソフトを作ってみました。
PIC側についてはこちら

仕様
・送りたい数値は1〜254
・1バイトのみ送信
・スライダーでちょっと操作しやすくしてみる


1〜254という微妙な範囲の数値はPIC側との兼ね合いです。
C#はまだよく分かっていないので入門書を片手に作りました。


早速問題発生wRS232Cを使った通信は文字しか送れないとのことで、2進数の数値をどう送ればいいのか悩みました。そこで以下のように変換に変換を重ねてなんとか成功。と思いきゃ、127までしか正常な数値が出ていない模様。この辺はもっといいやり方を含めて、ちゃんと調べる必要がありそうです。

 string s;
 int i;
 char[] c = new char[1];

 i = trackBar1.Value;
 c[0] = System.Convert.ToChar(i);

ともあれ、なんとか1〜126をシリアルポートから送信するプログラムが完成しました。まだよく分かっていませんが、例外処理も入れてみました。と言ってもポートが使われてるときにソフトが落ちないようになっているだけですがw


最終的な仕様として
・送れる数値は1〜126


となりました。PIC側で対応したので、動作としてはいい感じです。

2009/12/19追記

127までしか送れないのはchar型を途中で使っているからだと分かりました。charは8bitの符号付きの型なので、-126〜127が表現できます。しかし今回のモーターへ送信する数値に符号は必要ないので、符号無しの1バイトのデータを扱うbyte型を使うことにしました。これで0〜255が送信できます。
こんな基本的なことなんだからもっと早くに気づくべきだった・・・と反省しました^^;

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

   try
   {
    serialPort1.Close();
    serialPort1.Open();
    textBox1.AppendText("serial port opened\n");
   }
   catch
   {
    textBox1.AppendText("serial port open error\n");
   }         
  }

  private void trackBar1_MouseUp(object sender, MouseEventArgs e)
  {
   string s;
   int i;
   char[] c = new char[1];

   i = trackBar1.Value;
   c[0] = System.Convert.ToChar(i);
   serialPort1.Write(c, 0, 1);

   s = "send : " + i.ToString() + "\n";
   textBox1.AppendText(s);
  }

  private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  {
   serialPort1.Close();
  }

  private void button1_Click(object sender, EventArgs e)
  {
   string s;
   int i;
   char[] c = new char[1];

   i = 1;
   c[0] = System.Convert.ToChar(i);
   serialPort1.Write(c, 0, 1);

   trackBar1.Value = 1;

   s = "stop\n";
   textBox1.AppendText(s);
  }
 }
}