2011-10-26 49 views
59

Làm cách nào để chuyển đổi một int, n thành chuỗi để khi tôi gửi nó qua chuỗi nối tiếp, nó được gửi dưới dạng chuỗi?Làm thế nào để chuyển đổi int thành chuỗi trên Arduino?

Đây là những gì tôi có cho đến nay:

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++; 
} 
+0

Không sprintf trên Arduino? – Pubby

+0

? Tất cả các ý kiến ​​đã được ở đây đã biến mất .... những gì đã xảy ra? – user947659

+3

@Pubby "printf() làm cho đối tượng thực thi của bạn ~ 1000 byte lớn hơn, vì vậy bạn có thể không muốn sử dụng nó nếu kích thước là một vấn đề." http://playground.arduino.cc/Main/Printf –

Trả lời

89

Sử dụng như thế này:

String myString = String(n); 

Bạn có thể tìm thêm ví dụ here.

+2

Bạn không cần sử dụng đối tượng String, Serial.print hoặc println đã chuyển đổi chúng! –

+0

Tôi đang tìm cách chuyển đổi 97 thành ký tự 'a' hoặc 65 thành ký tự 'A'. Tôi có nghĩa là số ASCII cho nhân vật. Tôi thấy cách này không hiệu quả. –

+0

@OkiErieRinaldi: Bạn có thể sử dụng - char bar = 97; nó sẽ hoạt động. – Cassio

-2

trong ví dụ đầu tiên, một chuỗi C cổ điển đang được sử dụng: nó chỉ là một mảng các ký tự được kết thúc bằng số không (ký tự NUL). các ví dụ khác sử dụng lớp String, một lớp C++ mà tôi sẽ chỉ đạo xa trừ các ví dụ về đồ chơi và các bản trình diễn nhỏ. Nó rò rỉ bộ nhớ theo những cách không dễ dự đoán, và dẫn đến sự khóa bí ẩn của bảng.

+1

Vì vậy, giải pháp của bạn là gì? – localhost

9

Đây là giải pháp tối ưu hóa tốc độ để chuyển đổi int (số nguyên 16 bit đã ký) thành chuỗi.

Triển khai này tránh sử dụng phân chia vì AVR 8 bit được sử dụng cho Arduino không có hướng dẫn DIV phần cứng, trình biên dịch dịch thành các phép trừ lặp đi lặp lại tốn nhiều thời gian. Vì vậy, giải pháp nhanh nhất là sử dụng các nhánh có điều kiện để xây dựng chuỗi.

Bộ đệm 7 byte cố định được chuẩn bị từ đầu trong RAM để tránh phân bổ động. Vì nó chỉ có 7 byte, chi phí sử dụng RAM cố định được coi là tối thiểu. Để hỗ trợ trình biên dịch, chúng tôi thêm công cụ sửa đổi đăng ký vào khai báo biến để thực thi tăng tốc.

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() {} 

phác thảo này được biên soạn để 1.082 byte mã sử dụng avr-gcc mà đi kèm với Arduino v1.0.5 (kích thước của chức năng int2str chính nó là 594 byte). So với giải pháp sử dụng đối tượng String được biên dịch thành 2.398 byte, việc triển khai này có thể giảm kích thước mã của bạn xuống 1,2 Kb (giả sử rằng bạn không cần phương thức đối tượng String khác và số của bạn là nghiêm ngặt đối với loại int đã ký).

Chức năng này có thể được tối ưu hóa thêm bằng cách viết nó vào mã lắp ráp thích hợp.

+1

Một cách tiếp cận khác để tránh DIV là nhân với (2^N/10) và sau đó chuyển ngay bằng N bit. Vì vậy, đối với N = 16, x/10 ~ = (x * 6554) >> 16. Đóng đủ cho hầu hết các chữ số. –

1

Giải pháp quá lớn. Hãy thử cái này đơn giản. Vui lòng cung cấp bộ đệm gồm 7 ký tự, không thực hiện kiểm tra.

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; 
} 

Có thể dễ dàng sửa đổi để trả lại bộ đệm, nếu bạn loại bỏ chỉ mục 'l' và tăng bộ đệm trực tiếp.

16

sử dụng itoa() chức năng bao gồm trong stdlib.h

char buffer[7];   //the ASCII of the integer will be stored in this char array 
itoa(-31596,buffer,10); //(integer, yourBuffer, base) 
9

Bạn chỉ cần quấn nó xung quanh một đối tượng String như thế này:

String numberString = String(n); 

Bạn cũng có thể làm:

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 
Các vấn đề liên quan