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

То, что я собрал в сети, у меня не работает. У меня есть Visual Studio и обработка, отправляющие эту функцию через последовательный порт на тот же COM-порт 9 с той же скоростью передачи данных, и я ничего не получаю. Единственный способ, которым этот код выше будет выполняться, — это если я изменю тип данных на char на стороне Arduino, несмотря на то, что и Visual Studio 2013, и обработка отправляют строки через последовательный порт.

String id; 
int led = 6;

void setup() {
 Serial.begin(9600);
 pinMode(led, OUTPUT); 
}

 void loop() { 
id = Serial.readString(); 

if (id == "1") {
 digitalWrite(led, HIGH); 
} 

/* ОБРАБОТКА*/

if (mousePressed == true) { //если мы щелкнули в окне
myPort.write('1'); //отправить 1
} 
else { //иначе
myPort.write('0'); //отправить 0
} 
}

/* Визуальная Студия */

if (r == "switch") { port.Open(); port.WriteLine("1"); port.Close(); }

Даже в моем новом обновлении для Arduino я все еще не получаю ничего, что могло бы выполнить нужную мне функцию, несмотря на то, что я нашел новые функции, которые, как предполагается, преобразуют символы в строки.

Подойдет любой из этих типов данных: char, byte, int
< a href="http://www.arduino.cc/en/Reference/ASCIIchart.html">http://www.arduino.cc/en/Reference/ASCIIchart.html

char id;
int led = 6; 

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);

}

void loop()
{
  //id = Serial.read();//id = Serial.read() - '0';
  //id = Serial.read();
  String idi = String(idi);

  /*

    will only read the 1st bit on the buffer so
    no 10s...90s because the whole char so we
    need to use Strings datatype somehow but
    the thing is that the Serial.Read func only
    reads the first byte. R&D

  */
  if (idi == "1")
  {
    digitalWrite(led, HIGH);
    //    Serial.println("on");
  }
  else if (idi == "B2")
  {
    digitalWrite(led, LOW);

    Serial.println("off");
  }
  else if (idi == "C")
    for (int I = 0; I < 15; I++)
      //  for (int ledP = 0; ledP < 15; ledP++)
    {
      digitalWrite(led, HIGH);
      delay(100);
      digitalWrite(led, LOW);
      delay(100);
    }
  Serial.flush();
}

Что мне действительно хотелось бы, так это превратить переменную idi в строку, чтобы я мог просто быть более описательным с моими вызовами функций, и в то же время, чтобы я мог быть более креативным с моими вызовами функций, так как мне придется много писать, а написание вызовов с использованием символов от 0 до 9 недостаточно, так как если я начну использовать последовательный порт 10/99, будет считываться только первый байт, вызывая 1/9. Например:

  if (Serial.available())
  { // If data is available to read,
    dat = Serial.read(); //  dat = Serial.read() - '0';

  }
  if (dat == "angel")
  { 
    digitalWrite(6, HIGH); // turn the LED on
    //Serial.println("angel" + dat);
  } 
  //  delay(10); // Wait 10 milliseconds for next reading
}

в отличие от

  if (Serial.available())
  { // If data is available to read,
    dat = Serial.read(); //  dat = Serial.read() - '0';

  }
  if (dat == '1')
  { // If 1 was received
    digitalWrite(6, HIGH); // turn the LED on
    //Serial.println("A" + dat);
  } else {
    digitalWrite(6, LOW);
   }
  //  delay(10); // Wait 10 milliseconds for next reading
}

, 👍-2


1 ответ


-2

Вы можете захватить все оставшиеся байты в цикле и собрать их в строку:

  String allWaitingSerialData;
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    allWaitingSerialData+= inChar;
  }

  Serial.printLn(allWaitingSerialData); // или что вам нужно сделать

Обратите внимание, что есть ~128-байтовый последовательный буфер, который ограничивает длину строки, собираемой этой процедурой, но, похоже, 128 байт вам подойдет. Ограничьте печать на другом конце, если эта процедура переполняется и теряет пакеты.

,

Прежде чем я приму это как ценный и окончательный ответ, в чем вообще смысл этой функции, если нужен такой длинный алгоритм? readString() или другие функции преобразования, найденные в arduino.cc, а что касается обработки, у них также есть свои собственные версии функций преобразования, подобные тем, которые я ищу, похожие на readString() с сайта arduino?, @Jai Lopez

Последовательные порты не имеют никаких типов в протоколе; только байты. Я не уверен, почему readString() не работает на 100%, но я знаю, что "старомодный" способ должен быть надежным и переносимым., @dandavis

В ходе своих исследований я узнал, что при использовании функции .Read() из библиотеки Serial and Wire данные, на которые вы ссылаетесь, считываются библиотекой как Char, если только вы явно не укажете это, указав тип данных obj, уточнив int, Char или String., @Jai Lopez

Я попробовал это, но предложенное вами средство мне не помогло. String allWaitingSerialData; в то время как (Serial.available()) { идентификатор символа = (символ)Последовательный.read(); allWaitingSerialData += id; } Serial.println(allWaitingSerialData); // или что вам нужно сделать Serial.println(id); // или что вам нужно сделать // идентификатор = Serial.read(); если (allWaitingSerialData == 'A1') { digitalWrite(светодиод, ВЫСОКИЙ); // Serial.println("ВКЛ"); }, @Jai Lopez

dandavis, есть идеи?, @Jai Lopez