HC-05 / HC-06 принимает строку как последовательность символов. Если вы хотите отправить 255, то HC-05 принимает это как «2», «5», «5». Итак, ваша первая работа - определить, является ли это целое число или строка. Я добавил другой префикс перед целым числом и строкой и общий постфикс ('#'), по которому я могу определить конец ввода. Надеюсь, это поможет вам.
while (Serial.available()) {
delay(3); //small delay to allow input buffer to fill
char c = Serial.read(); //gets one byte from serial buffer
if (c == '#') {
break;
} //breaks out of capture loop to print readstring
readString += c;
}
Теперь, после того, как вы взяли все биты, вам нужно выяснить, что вы взяли с помощью префикса.
if (readString.charAt(0) == 'i')
{
//"i255,255,255#"
readString.replace("i", "0");
value1 = readString.substring(1, 3).toInt();
value2 = readString.substring(5, 7).toInt();
value3 = readString.substring(8, 11).toInt();
readString = "";
}
else if (readString.charAt(0) == 's')
{
//Do as you wish
readString = "";
}
Я сделал бы это как это:
type E = Expression
def postfixExp = primaryExp ~ rep(
"[" ~> expr <~ "]" ^^ { e => ElementExpression(_:E, e) }
| "." ~ "length" ^^^ LengthExpression
| "." ~> ident ~ ("(" ~> repsep(expr, ",") <~ ")") ^^ flatten2 { (f, args) =>
CallMethodExpression(_:E, f, args)
}
) ^^ flatten2 { (e, ls) => collapse(ls)(e) }
def expr: Parser[E] = ...
def collapse(ls: List[E=>E])(e: E) = {
ls.foldLeft(e) { (e, f) => f(e) }
}
Сокращенный expressions
кому: expr
для краткости, а также добавил псевдоним типа E
по той же причине.
Прием, который я использую здесь для предотвращения ужасного анализа случая, должен возвратить значение функции из внутреннего производства. Эта функция берет Expression
(который будет primary
) и затем возвращает новое Expression
на основе первого. Это объединяет два случая точечной отправки и выражений в скобках. Наконец, collapse
метод используется для слияния линейного List
из значений функции в надлежащий AST, начиная с указанного первичного выражения.
Отметьте это LengthExpression
просто возвращается как значение (использование ^^^
) от его соответствующего производства. Это работает, потому что компаньон возражает для классов случая (принимающий это LengthExpression
действительно класс случая), расширяют соответствующее делегирование значения функции до их конструктора. Таким образом, функция, представленная LengthExpression
берет сингл Expression
и возвращает новый экземпляр LengthExpression
, точно удовлетворяя наши потребности в древовидной конструкции высшего порядка.