Int n
を文字列に変換して、シリアル経由で送信したときに文字列として送信されるようにするにはどうすればよいですか。
これは私がこれまでに持っているものです:
int ledPin=13;
int testerPin=8;
int n=1;
char buf[10];
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(testerPin, OUTPUT);
Serial.begin(115200);
}
void loop()
{
digitalWrite(ledPin, HIGH);
sprintf(buf, "Hello!%d", n);
Serial.println(buf);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
n++;
}
stdlib.h
に含まれるitoa()
関数を使う
char buffer[7]; //the ASCII of the integer will be stored in this char array
itoa(-31596,buffer,10); //(integer, yourBuffer, base)
このようにStringオブジェクトをラップするだけです。
String numberString = String(n);
次のこともできます。
String stringOne = "Hello String"; // using a constant String
String stringOne = String('a'); // converting a constant char into a String
String stringTwo = String("This is a string"); // converting a constant string into a String object
String stringOne = String(stringTwo + " with more"); // concatenating two strings
String stringOne = String(13); // using a constant integer
String stringOne = String(analogRead(0), DEC); // using an int and a base
String stringOne = String(45, HEX); // using an int and a base (hexadecimal)
String stringOne = String(255, BIN); // using an int and a base (binary)
String stringOne = String(millis(), DEC); // using a long and a base
これはint(符号付き16ビット整数)を文字列に変換するための速度最適化ソリューションです。
Arduinoに使用される8ビットAVRにはハードウェアDIV命令がないため、この実装では除算を使用しません。コンパイラは除算を時間のかかる反復減算に変換します。したがって、最速の解決策は、条件付き分岐を使用して文字列を構築することです。
動的割り当てを回避するためにRAMの先頭から7バイトの固定バッファが用意されています。たった7バイトなので、固定されたRAM使用のコストは最小と見なされます。コンパイラを支援するために、実行をスピードアップするために変数宣言にregister修飾子を追加します。
char _int2str[7];
char* int2str( register int i ) {
register unsigned char L = 1;
register char c;
register boolean m = false;
register char b; // lower-byte of i
// negative
if ( i < 0 ) {
_int2str[ 0 ] = '-';
i = -i;
}
else L = 0;
// ten-thousands
if( i > 9999 ) {
c = i < 20000 ? 1
: i < 30000 ? 2
: 3;
_int2str[ L++ ] = c + 48;
i -= c * 10000;
m = true;
}
// thousands
if( i > 999 ) {
c = i < 5000
? ( i < 3000
? ( i < 2000 ? 1 : 2 )
: i < 4000 ? 3 : 4
)
: i < 8000
? ( i < 6000
? 5
: i < 7000 ? 6 : 7
)
: i < 9000 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 1000;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// hundreds
if( i > 99 ) {
c = i < 500
? ( i < 300
? ( i < 200 ? 1 : 2 )
: i < 400 ? 3 : 4
)
: i < 800
? ( i < 600
? 5
: i < 700 ? 6 : 7
)
: i < 900 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 100;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// decades (check on lower byte to optimize code)
b = char( i );
if( b > 9 ) {
c = b < 50
? ( b < 30
? ( b < 20 ? 1 : 2 )
: b < 40 ? 3 : 4
)
: b < 80
? ( i < 60
? 5
: i < 70 ? 6 : 7
)
: i < 90 ? 8 : 9;
_int2str[ L++ ] = c + 48;
b -= c * 10;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// last digit
_int2str[ L++ ] = b + 48;
// null terminator
_int2str[ L ] = 0;
return _int2str;
}
// Usage example:
int i = -12345;
char* s;
void setup() {
s = int2str( i );
}
void loop() {}
このスケッチはArduino v1.0.5に同梱されているavr-gccを使って1,082バイトのコードにコンパイルされています(int2str関数自体のサイズは594バイトです)。 2,398バイトにコンパイルされたStringオブジェクトを使用したソリューションと比較して、この実装はあなたのコードサイズを1.2 Kbだけ減らすことができます。
この関数は適切なアセンブラコードで書くことによってさらに最適化することができます。
解決策は大きすぎる。これを試してみてください。 7文字以上のバッファを用意してください。チェックは行われません。
char *i2str(int i, char *buf){
byte l=0;
if(i<0) buf[l++]='-';
boolean leadingZ=true;
for(int div=10000, mod=0; div>0; div/=10){
mod=i%div;
i/=div;
if(!leadingZ || i!=0){
leadingZ=false;
buf[l++]=i+'0';
}
i=mod;
}
buf[l]=0;
return buf;
}
インデックス 'l'を破棄してバッファを直接インクリメントする場合は、バッファの終わりを返すように簡単に変更できます。
以下は、コードがはるかに小さい自己構成型myitoa()で、char * mystringに7(終了0を含む)のFIXED配列を予約していることがよくあります。可変長の出力文字列が必要な場合は、代わりに文字シフトでコードを構築できることは明らかです。
void myitoa(int number, char *mystring) {
boolean negative = number>0;
mystring[0] = number<0? '-' : '+';
number = number<0 ? -number : number;
for (int n=5; n>0; n--) {
mystring[n] = ' ';
if(number > 0) mystring[n] = number%10 + 48;
number /= 10;
}
mystring[6]=0;
}
Serial.println(val)
Serial.println(val, format)
詳細については、あなたはarduinoのサイトにアクセスすることができます https://www.arduino.cc/en/Serial/Println
これがお役に立てば幸いです。ありがとうございます。