Как преобразовать прочитанные символы в строки?

Как я могу добавить строку, например "AA 00 01 00 FF FF A2", к последовательным данным с помощью Arduino?

Следующий код кажется неправильным:

String comdata;
void loop() {
  while (Serial2.available() > 0) {
    c = Serial2.read();
    //c is "AA 00 01 00 FF FF A2"
    comdata +=c;
  }
  if(comdata.length()>0){
    Serial.println(comdata);
    //YES on HEX mode ;print "AA 00 01 00 FF FF A2"  
    }
    delay(1000);
}

, 👍1

Обсуждение

Как отправить символ "с"? как символ ascii ‘A’ ‘A’ ‘0’ ‘0’ ... ? или как числовое значение ‘0xAA’ ‘0x00’ ?, @leoc7

Я знаю, что вы могли бы сделать " Serial.ReadString ()", чтобы получить весь буфер в виде строки. Не существует ли Serial2.ReadString ()?, @Levi Lesches


4 ответа


0

Если я правильно понял ваш вопрос, то, пожалуйста, попробуйте следующий код:

uint8_t str[64];
uint8_t chrCtr = 0;
uint16_t twoChr;
boolean isSecondChr = false;

void setup()
{
  Serial.begin(57600);
}

void loop()
{
  uint8_t chr;
  while (Serial.available())
  {
    chr = Serial.read();
    if ('a' <= chr && chr <='f')
    {
      chr &= 0x5F; // make it uppercase
    }
    if ('0' <= chr && chr <= '9' || 'A' <= chr && chr <= 'F')
    {
      if (!isSecondChr)
      {
        twoChr = chr << 8;
        isSecondChr = true;
      }
      else
      {
        twoChr |= chr;
        isSecondChr = false;
        str[chrCtr++] = hexToAscii(twoChr);
        if (chrCtr == 63)
        {
          str[chrCtr] = 0; // A string always terminated by zero
          Serial.println((char *)str);
          chrCtr = 0;
        }
      }
    }
    else if (chr == '#') // input terminated
    {
      str[chrCtr] = 0; // A string always terminated by zero
      Serial.println((char *)str);
      chrCtr = 0;
    }
    else
    {
      isSecondChr = false;
      // other character will be dropped
    }
  }
}

uint8_t hexToAscii(uint16_t hexWord)
{
  return (hexToBin(highByte(hexWord)) << 4) + hexToBin(lowByte(hexWord)); 
}

uint8_t hexToBin(uint8_t hexByte)
{
  return hexByte <= '9' ? hexByte - 48 : hexByte - 55;
}
,

0

Если вы объявите переменную c как символ, то ваш скетч выведет "AA 00 01 00 FF FF A2" на последовательный монитор.

String comdata;

void setup(){
 Serial.begin(9600); 
}

void loop(){
  while(Serial.available() > 0){
    // Input is "AA 00 01 00 FF FF A2"
    char c = Serial.read();
    comdata +=c;
  }
  if(comdata.length() > 0){
    Serial.println(comdata);
    // Prints "AA 00 01 00 FF FF A2"  
  }
  delay(1000);
}
,

0

Я понял. моя функция записи для преобразования, ее работа! Спасибо

String tohex(int n) {
  if (n == 0) {
    return "00"; //n为0
  }
  String result = "";
  char _16[] = {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };
  const int radix = 16;
  while (n) {
    int i = n % radix;           
    result = _16[i] + result;   
    n /= radix;                 
  }
  if (result.length() < 2) {
    result = '0' + result; 
  }
  return result;
}
,

Пожалуйста, отредактируйте свой ответ, чтобы объяснить, в чем заключалось решение, чтобы оно было полезно другим читателям в будущем., @MichaelT


0
String readString;
char c;

void setup() {
 Serial2.begin(9600);
}

void loop() 
{
   while (Serial2.available()) {
      delay(3);  //задержка для заполнения буфера
      if (Serial2.available() > 0) {
        c = Serial2.read();  //получает один байт из последовательного буфера
        readString += c; //делает строку readString
      }
    }

     if (readString.length() > 0)
    {  
      Serial2.println(readString);
    }
}
,