2017-10-18 260 views
-1

我正在做一個函數在Arduino中將一個整數轉換成十六進制char *,但是我遇到了無法將字符串轉換爲char *的問題。也許如果有辦法爲char *動態分配內存,我不需要類String。如何將字符串轉換爲Arduino中的char *?

char *ToCharHEX(int x) 
{ 
    String s; 
    int y = 0; 
    int z = 1; 
    do 
    { 

     if (x > 16) 
     { 
      y = (x - (x % 16))/16; 
      z = (x - (x % 16)); 
      x = x - (x - (x % 16)); 
     } 
     else 
     { 
      y = x; 
     } 
     switch (y) 
     { 
     case 0: 
      s += "0"; 
      continue; 
     case 1: 
      s += "1"; 
      continue; 
     case 2: 
      s += "2"; 
      continue; 
     case 3: 
      s += "3"; 
      continue; 
     case 4: 
      s += "4"; 
      continue; 
     case 5: 
      s += "5"; 
      continue; 
     case 6: 
      s += "6"; 
      continue; 
     case 7: 
      s += "7"; 
      continue; 
     case 8: 
      s += "8"; 
      continue; 
     case 9: 
      s += "9"; 
      continue; 
     case 10: 
      s += "A"; 
      continue; 
     case 11: 
      s += "B"; 
      continue; 
     case 12: 
      s += "C"; 
      continue; 
     case 13: 
      s += "D"; 
      continue; 
     case 14: 
      s += "E"; 
      continue; 
     case 15: 
      s += "F"; 
      continue; 
     } 
    }while (x > 16 || y * 16 == z); 
    char *c; 
    s.toCharArray(c, s.length()); 
    Serial.print(c); 
    return c; 
} 

toCharArray()函數不會將字符串轉換爲char數組。 Serial.print(c)正在返回空白打印。我不知道我能做什麼。

+0

my_string.c_str()中的Arduino IDE不行 –

+1

提示整數的十六進制值:什麼是'y,z'的值第一次'int y; int z; while(x> 16 || y * 16 == z)'是否被執行? – chux

+0

my_string.data()或&my_string [0]它將獲得指向內部字符數組的指針。 –

回答

3

更新:你的問題回覆:String -> char*轉換:

String.toCharArray(char* buffer, int length)想要一個字符數組緩衝區和緩衝區的大小。

特別 - 在這裏你的問題是:

  1. char* c是從來沒有初始化的指針。
  2. length應該是緩衝區的大小。該字符串知道它有多長。

所以,一個更好的方式來運行,這將是:

char c[20]; 
s.toCharArray(c, sizeof(c)); 

或者,你可以用malloc初始化c,但隨後你以後必須free它。像這樣使用堆棧可以節省時間並保持簡單。

參考:https://www.arduino.cc/en/Reference/StringToCharArray


在你的代碼的意圖:

這基本上是一個重複的問題:https://stackoverflow.com/a/5703349/1068537

見Nathan的鏈接答案:

// using an int and a base (hexadecimal): 
stringOne = String(45, HEX); 
// prints "2d", which is the hexadecimal version of decimal 45: 
Serial.println(stringOne); 

除非學術用途需要此代碼,否則您應該使用標準庫提供的機制,而不是重新發明輪子。

  • String(int, HEX)返回你希望轉換
  • Serial.print接受String作爲參數
+0

我的上帝!我知道如何將int轉換爲十六進制,問題不在於此。我想要在char *中轉換字符串。 –

+0

我的代碼完全是爲了學術目的。 –