Как читать отрицательный номер с serial.read

как я могу читать отрицательное число с помощью команды Serial.read ()? beacouse i с этим

    char tmpChar = Serial.read(); //read incoming character from serial port
    if (isDigit(tmpChar)) { //check if the in character it's a number
        setpoint =  (setpoint  * 10 ) + tmpChar - '0'; // convert from ascii code to it's corresponding number; '0' == DEC 48
      }
if (tmpChar == '\n' || tmpChar == '\r') { //if CR or LF was received
    if (setpoint > 0) {
      tmpChar = "";
      Serial.print(setpoint);
      Serial.println(" NUMERO STEP IN AVANTI");

    }

im, используя двигатель энкодера, я хочу переместить для N шагов вперед вперед (положительное число) или назад (отрицательное число), i вставить номер шага в последовательный вход

Я могу читать только положительное число. Спасибо за помощь

как предложил Маженко и сделал частичное решение:

char buf[8];
int valore = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() >= 8) {
    for (int i = 0; i < 8; i++) {
      buf[i] = Serial.read();

    }
    String str();
    if (buf[0] == "-") {
      valore = (atoi(buf)) * -1;
      Serial.println(valore);

    }
    else {
      valore =  atoi(buf);
      Serial.println(valore);
    }
  }
}

, но проблема теперь в том, что это статический массив, неприятно использовать

2 голоса | спросил Francesco Valla 8 J0000006Europe/Moscow 2017, 13:32:24

3 ответа


0

Лично я читал данные в массиве символов, затем использовал либо atoi(), либо strtol(), чтобы преобразовать этот массив символов в число.

Использование этих функций является более надежным, если вы сами разбираете данные, так как они идентифицируют, где заканчивается номер, и отбрасывает любой конечный мусор. Он также пропускает любое пробел перед номером. Например, он будет интерпретировать все это как число -32: " -32", "-32 Degrees", " -32+4 " и "-32-2".

strtol() имеет дополнительное преимущество, что он может работать в других базах, чем 10, поэтому вы можете интерпретировать шестнадцатеричные данные, двоичные данные, sexagesimal данные и т. д.

atoi() и strtol() являются стандартными C.

например:.

int val = atoi(mycharbuffer);

или

long val = strtol(mycharbuffer, NULL, 10);
ответил Majenko 8 J0000006Europe/Moscow 2017, 13:55:15
2

Вы можете сделать что-то вроде этого:

 static int setpoint;      // the partially read setpoint
static bool isNegative;   // whether it should be negative
void applySetpoint(int);  // apply the setpoint when fully read

char tmpChar = Serial.read();
if (isDigit(tmpChar)) {
    setpoint =  (setpoint  * 10 ) + tmpChar - '0';
} else if (tmpChar == '-') {  // minus sign
    isNegative = true;
} else if (tmpChar == '\r') {  // line terminator
    if (isNegative) {
        setpoint = -setpoint;
        isNegative = false;  // reset for next read
    }
    applySetpoint(setpoint);
}

Обратите внимание, что это не очень надежное: он будет счастливо интерпретировать «3-2» как что означает «-32». Заметьте также, что я предположил, что ваш терминатор будет '\ r', вы может использоваться другой.

ответил Edgar Bonet 8 J0000006Europe/Moscow 2017, 13:40:08
0

parseInt может читать отрицательные числа (я думаю, что это так, ссылка очень загадочна). parseInt имеет timeout , поэтому он не ждет навсегда.

Можете ли вы рассказать, какие данные вы читаете? Является ли он частью более данных?

ответил Jot 8 J0000006Europe/Moscow 2017, 13:48:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132