Serial и long int
- Войдите на сайт для отправки комментариев
Добрый день!
Хочу считывать по 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мс.