Serial и long int

loginex
Offline
Зарегистрирован: 19.02.2012

Добрый день!

Хочу считывать по serial целые числа размером long int. Вот до чего додумался сейчас. В данный момент протоколо такой: перед числом передается его длинна(PacketLenght) и контрольная сумма - они фиксированной длинны, за ними само число в десятичном виде, т.е. 1235678890 . В самом конце передается символ '%', который означает конец данных. Вот такой код получился:

    while (PacketLenght--) считываем данные, согласно известному размеру пакета
      {
        buf_result = (Serial.read() - '0'); кладем их в буферное значение, вычтив символ 0, чтобы получить десятичное число
        end_f = buf_result + '0'; здесь храним прочитанное значение, но не вычитая этот символ
        if(end_f != '%') { если мы не получили символ конца последовательности
          result = result * 10 + buf_result; то предудщий результат умножаем на 10 и прибавляем наше считанное число
          delay(1); устанавливаем задержку на 1мс!
          }
          else {Serial.println("Incomplete packet"); break; }; если пришел символ конца последовательности раньше, чем мы этого ожидали - то выходим из цикла
      }

Устанавливать задержку приходиться по той причине, что пакет мог прийти на буфер еще не весь, и тогда
buf_result = (Serial3.read() - '0');
выполниться не так, как оно было задуманно. т.е. из ничего вычтется '0' и получится какая-нибудь хрень.

Можно конечно в код перед Serial.read() добавить что-нибудь вроде while(Serial.avialable()<1) {delaymicros(10);}, но вдруг символы потеряются по дороге и ничего не придет, тогда процедура зависнет на этом месте и будет ожидать данных от другого пакета...

 

Как можно сделать хорошо и правильно ? желательно без установки задержки. А то приходиться тратить много времени, если пакет большой. скажем 4 000 000 000 будет обрабатываться 10мс.

Mastino
Offline
Зарегистрирован: 03.12.2011
#define SOP '<'
#define EOP '>'

bool started = false;
bool ended = false;

char inData[80];
byte index;

void setup()
{
   Serial.begin(57600);
   // Other stuff...
}

void loop()
{
  // Read all serial data available, as fast as possible
  while(Serial.available() > 0)
  {
    char inChar = Serial.read();
    if(inChar == SOP)
    {
       index = 0;
       inData[index] = '\0';
       started = true;
       ended = false;
    }
    else if(inChar == EOP)
    {
       ended = true;
       break;
    }
    else
    {
      if(index < 79)
      {
        inData[index] = inChar;
        index++;
        inData[index] = '\0';
      }
    }
  }

  // We are here either because all pending serial
  // data has been read OR because an end of
  // packet marker arrived. Which is it?
  if(started && ended)
  {
    // The end of packet marker arrived. Process the packet

    // Reset for the next packet
    started = false;
    ended = false;
    index = 0;
    inData[index] = '\0';
  }
}