/Work/

[Profile] [File] [Work] [Link]

SerialController
(PLEN用のシリアル通信ソフト)



用途

PLEN(ロボット)はBluetoothでシリアル通信を行うことによって、予め記録したモーションを再生することができるのですが、
JAVAやその他のプログラムでコントロールできるように、exe形式でコマンドラインパラメータを付けることでモーションを再生できるようにしたソフトです。

DownLoad

SerialController.exe
source code

使い方

ロボットとコネクションをはった状態でコマンドプロンプトなどで
SerialControoler1.exe 0 1
とやれば登録した一番目の動きをさせることができます。

Javaの例を載せます
01   public static void main(String[] args) {
02     //PLENに設定された01番目の動作を実行
03     move(new String[] { "0""1" });
04   }
05   
06   public static void move(String[] args) {
07 
08         String[] argv = new String[args.length + 1];
09         argv[0"C:/Documents and Settings/SerialController.exe";
10         for (int i = 1; i < argv.length; i++) {
11                 argv[i= args[i - 1];
12         }
13         try {
14                 Runtime rt = Runtime.getRuntime();
15                 rt.exec(argv);
16         catch (IOException ex) {
17                 ex.printStackTrace();
18         }
19 
20   }

作り方

他で開かれている Serial Port の参照方法 - MSDN フォーラム を参考に
http://www.eltima.com/products/serial-port-monitor/から
Serial Port Monitor をダウンロードします。(試用で2週間使えるのでその間にPLENのシリアル通信を解析します)



解析した結果一定の規則性があることが分かるのでそれを元にC#でプログラムを作ります。

ソースコードの主要部分

   1:          static void Main(string[] args)
   2:          {
   3:              System.IO.Ports.SerialPort serialPort1 = new System.IO.Ports.SerialPort();
   4:              serialPort1.PortName = "COM3";
   5:              serialPort1.Open();
   6:   
   7:              char[] serial_char_array;
   8:              serial_char_array = no_motion(1);
   9:              int tmp = 0;
  10:              int mode = 9;
  11:              if (args.Length != 0)
  12:              {
  13:                  System.Console.WriteLine(args[0]);
  14:                  
  15:                  //args[0]が
  16:                  //0:設定した動き0〜9
  17:                  //1:設定した動き10〜19
  18:                  //2:目のライトを点灯
  19:                  //3:単純な動き(前進や後退など)
  20:                  //4:動きを止める
  21:   
  22:   
  23:                  //例0:登録した一番目の動きをする#SerialControoler1.exe 0 1
  24:                  //例1:登録した11番目の動きをする#SerialControoler1.exe 1 1
  25:                  //例2-1:ライトを点灯する#SerialControoler1.exe 2 1
  26:                  //例2-2:ライトを5秒間チカチカさせる#SerialControoler1.exe 2 2 5
  27:                  //例3:前進10秒の場合は#SerialControoler1.exe 3 10 f
  28:                  //例4:動きを止める#SerialControoler1.exe 4
  29:                  mode = int.Parse(args[0]);
  30:                  if(args.Length > 1)
  31:                  {
  32:                      tmp = int.Parse(args[1]);
  33:                      System.Console.WriteLine(args[1]);
  34:                  }
  35:                  
  36:   
  37:                  //test
  38:                  //mode = 2;
  39:                  //tmp = 0;
  40:                  if(mode == 0)
  41:                  {
  42:                      serial_char_array = mk_motion_array0(tmp);
  43:                  }
  44:              if (serial_char_array.Length > 1)
  45:              {
  46:                  serialPort1.Write(serial_char_array, 0, serial_char_array.Length);
  47:              }
  48:              
  49:              serialPort1.Close();
  50:          }
  51:   
  52:          static char[] mk_motion_array0(int selscted_num)
  53:          {
  54:              char[] serial_char = new char[7];
  55:              serial_char[0] = '\x0001';
  56:              serial_char[1] = '\x006d';
  57:              serial_char[2] = '\x0070';
  58:              serial_char[3] = '\x001d';
  59:              serial_char[4] = '\x0030';
  60:              //serial_char[5] = '\x0032';
  61:              //String num_str = "1";
  62:   
  63:              int ascii_num = 48 + selscted_num;
  64:              serial_char[5] = (char)ascii_num;
  65:   
  66:              serial_char[6] = '\x001e';
  67:   
  68:              return serial_char;
  69:          }

参考リンク

C#で16進数やASCIIの扱い方

http://msdn2.microsoft.com/ja-jp/library/x9h8tsay(VS.80).aspx
文字コード入門―ASCIIとJISローマ字―
ASCII文字コード : IT用語辞典
@IT:.NET TIPS 2進数文字列と16進数文字列を相互に変換するには? - C#

C#でSerialPortを使ったシリアル通信

浅草ギ研 Visual C# 2005 のシリアル通信機能を使ってみる
シリアル通信のアプリケーション サンプル
SerialPort.Write メソッド (Byte[], Int32, Int32) (System.IO.Ports)
VB2005 シリアル通信 16進データの送信について