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мс.
#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'; } }