printf

11月 29th, 2008 tocmoc

今までprocessingではC言語のprintfのように便利な出力関数がなくてprintlnめんどくせと思ってたが,JAVAの機能の方にあった.JS2E 5.0,JDK5で実装されてたようなので,ずいぶん前だ.2005年くらいか?

ただ,微妙にCとは書式が違うようなので,注意が必要.
ここが一覧で見れてベンリ.
http://www.ne.jp/asahi/hishidama/home/tech/java/formatter.html

Cと同じように使えるprintfすばらしい!

JAVA:
  1. int a=10;
  2. float b=12345.1234567;
  3. double c=12345.1234567;
  4. String str="abcde";
  5.  
  6. System.out.printf("%d %05d\n",a, a);
  7. System.out.printf("%f %.3f\n",b, b);
  8. System.out.printf("%f %.8f\n",c, c);
  9. System.out.printf("%s %S\n",str, str);
  10. System.out.printf("%d\n%,8f\n%10s\n",a,b,str);

出力は,

CODE:
  1. 10 00010
  2. 12345.123047 12345.123
  3. 12345.123047 12345.12304688
  4. abcde ABCDE
  5. 10
  6. 12,345.123047
  7.      abcde

でもあれ・・・?実数の精度がおかしいような・・・?processingのせい?

arduino — シリアル通信で文字列の受信

5月 28th, 2008 tocmoc

arduinoのIDEでシリアル通信をする場合は,Serial.read()を使うが,送られてきたデータの最初のBYTEしか読めない(0~255までしか使えない).

そこで,255以上の数字を受信するために,数字を文字列で受信して(当然送信側でも文字列として送信する),後で数字に直すという方法を使う.
arduinoはC,C++ベースなので,atoi()が使えば後で数字に直すのも簡単.

arduino側

C:
  1. void setup(){
  2.   Serial.begin(9600);
  3. }
  4.  
  5. void loop(){
  6.   char str[20]; // 数字(文字列)の受信用配列
  7.  
  8.   // シリアルからのデータ受信
  9.   recvStr(str);
  10.   int aa = atoi(str);
  11. }
  12.  
  13. void recvStr(char *buf)
  14. {
  15.   int i = 0;
  16.   char c;
  17.   while (1) {
  18.     if (Serial.available()) {
  19.       c = Serial.read();
  20.       buf[i] = c;
  21.       if (c == '\0') break; // 文字列の終わりは\0で判断
  22.       i++;
  23.     }
  24.   }
  25.   buf[i] = '\0';
  26. }

送信側でproce55ingを使うとすれば,下のコードみたいな感じで送信する.
文字列の終端を表す\0を付け足しているのがミソ.上のarduino側ではこの\0を目印にして文字列の終わりを判断しているので,両側で同じ文字を目印にしておけば大丈夫.
\0じゃなくて\nとかでもOK.

proce55ing側

JAVA:
  1. import processing.serial.*;
  2. Serial port;
  3.  
  4. void setup()
  5. {
  6.   size(100,100);
  7.   port = new Serial(this, "COM8", 9600);
  8.   port.clear();
  9. }
  10.  
  11. void draw() {
  12.   int poss;
  13.   poss = 1000; // 255以上の数字
  14.   port.write(str(poss)+"\0");
  15.   poss = -1000; // マイナスでもOK
  16.   port.write(str(poss)+"\0");
  17. }