Задумал сделать пакетную передачу данных Arduino и PC, но что то пошло не так....
- Войдите на сайт для отправки комментариев
Сб, 08/12/2018 - 22:13
Здравствуйте форумчане, обращаюсь к вам за помощью. Задумал я сделать пакетную передачу данных для arduino и PC. Нашёл в интернете такую штуку:
http://robocraft.ru/blog/1090.html
и всё скопировал
String sp_startMarker; // Переменная, содержащая маркер начала пакета String sp_stopMarker; // Переменная, содержащая маркер конца пакета String sp_dataString; // Здесь будут храниться принимаемые данные int sp_startMarkerStatus; // Флаг состояния маркера начала пакета int sp_stopMarkerStatus; // Флаг состояния маркера конца пакета int sp_dataLength; // Флаг состояния принимаемых данных boolean sp_packetAvailable; // Флаг завершения приема пакета int bufferChar; long previousMillis = 0; // храним время последнего переключения светодиода int ledState = LOW; long interval = 1000; // интервал между включение/выключением светодиода (1 секунда) String versionString; // Строка, содержащая какую-нибудь бесполезную информацию :) void setup() { versionString = "Version of serial protocol"; // Присваиваем бессмысленное значение бесполезной строке :) Serial.begin(9600); // Инициализируем последовательный интерфейс sp_SetUp(); // Инициализируем протокол. sp_Send("ver?"); pinMode(13, OUTPUT); } void loop() { unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState == LOW) ledState = HIGH; else ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(13, ledState); } } void feedback() { Serial.print("bufferChar="); Serial.println(bufferChar); Serial.print("sp_dataString="); Serial.println(sp_dataString); Serial.print("sp_startMarkerStatus="); Serial.println(sp_startMarkerStatus); Serial.print("sp_stopMarkerStatus="); Serial.println(sp_stopMarkerStatus); Serial.print("sp_dataLength="); Serial.println(sp_dataLength); Serial.print("sp_packetAvailable="); Serial.println(sp_packetAvailable); Serial.println(); } void ParseCommand() { if(sp_dataString == "ver?") // Если была принята строка «ver?» { sp_Send(versionString); // Отправляем на PC содержимое строки «versionString» } } void sp_SetUp() { sp_startMarker = "bspm"; // Так будет выглядеть маркер начала пакета sp_stopMarker = "espm"; // Так будет выглядеть маркер конца пакета sp_dataString.reserve(64); // Резервируем место под прием строки данных sp_ResetAll(); // Полный сброс протокола } void sp_ResetAll() { sp_dataString = ""; // Обнуляем буфер приема данных sp_Reset(); // Частичный сброс протокола } void sp_Reset() { sp_startMarkerStatus = 0; // Сброс флага маркера начала пакета sp_stopMarkerStatus = 0; // Сброс флага маркера конца пакета sp_dataLength = 0; // Сброс флага принимаемых данных sp_packetAvailable = false; // Сброс флага завершения приема пакета } void sp_Send(String data) { Serial.print(sp_startMarker); // Отправляем маркер начала пакета Serial.print(data.length()); // Отправляем длину передаваемых данных Serial.print(data); // Отправляем сами данные Serial.print(sp_stopMarker); // Отправляем маркер конца пакета } void serialEvent() { sp_Read(); // Вызов «читалки» принятых данных if(sp_packetAvailable) // Если после вызова «читалки» пакет полностью принят { ParseCommand(); // Обрабатываем принятую информацию sp_ResetAll(); // Полный сброс протокола. } } void sp_Read() { Serial.print("step="); Serial.println(1); feedback(); while(Serial.available() && !sp_packetAvailable) // Пока в буфере есть что читать и пакет не является принятым { Serial.print("step="); Serial.println(2); feedback(); bufferChar = Serial.read(); // Читаем очередной байт из буфера Serial.print("step="); Serial.println(3); feedback(); if(sp_startMarkerStatus < sp_startMarker.length()) // Если стартовый маркер не сформирован (его длинна меньше той, которая должна быть) { if(sp_startMarker[sp_startMarkerStatus] == bufferChar) // Если очередной байт из буфера совпадает с очередным байтом в маркере { Serial.print("step="); Serial.println(4); feedback(); sp_startMarkerStatus++; // Увеличиваем счетчик совпавших байт маркера Serial.print("step="); Serial.println(5); feedback(); } else { Serial.print("step="); Serial.println(6); feedback(); sp_ResetAll(); // Если байты не совпали, то это не маркер, расходимся. Serial.print("step="); Serial.println(7); feedback(); } } else { // Стартовый маркер прочитан полностью if(sp_dataLength <= 0) // Если длинна пакета на установлена { Serial.print("step="); Serial.println(8); feedback(); sp_dataLength = bufferChar; // Значит этот байт содержит длину пакета данных Serial.print("step="); Serial.println(9); feedback(); } else // Если прочитанная из буфера длинна пакета больше нуля { if(sp_dataLength > sp_dataString.length()) // Если длинна пакета данных меньше той, которая должна быть { Serial.print("step="); Serial.println(10); feedback(); sp_dataString += (char)bufferChar; // прибавляем полученный байт к строке пакета Serial.print("step="); Serial.println(11); feedback(); } else // Если с длинной пакета данных все нормально { if(sp_stopMarkerStatus < sp_stopMarker.length()) // Если принятая длинна маркера конца пакета меньше фактической { if(sp_stopMarker[sp_stopMarkerStatus] == bufferChar) // Если очередной байт из буфера совпадает с очередным байтом маркера { Serial.print("step="); Serial.println(12); feedback(); sp_stopMarkerStatus++; // Увеличиваем счетчик удачно найденных байт маркера Serial.print("step="); Serial.println(13); feedback(); if(sp_stopMarkerStatus == sp_stopMarker.length()) { // Если после прочтения очередного байта маркера, длинна маркера совпала, то сбрасываем все флаги (готовимся к приему нового пакета) Serial.print("step="); Serial.println(14); feedback(); sp_Reset(); Serial.print("step="); Serial.println(15); feedback(); sp_packetAvailable = true; // и устанавливаем флаг готовности пакета Serial.print("step="); Serial.println(16); feedback(); } } else { Serial.print("step="); Serial.println(17); feedback(); sp_ResetAll(); // Иначе это не маркер, а хз что. Полный ресет. Serial.print("step="); Serial.println(18); feedback(); } } // } } } } }
запускаю, и, судя по тому, что мне в ответ на "bspm4ver?espm", шлёт ардуина,
bspm4ver?espm step=1 bufferChar=0 sp_dataString= sp_startMarkerStatus=0 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=2 bufferChar=0 sp_dataString= sp_startMarkerStatus=0 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=3 bufferChar=98 sp_dataString= sp_startMarkerStatus=0 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=4 bufferChar=98 sp_dataString= sp_startMarkerStatus=0 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=5 bufferChar=98 sp_dataString= sp_startMarkerStatus=1 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=2 bufferChar=98 sp_dataString= sp_startMarkerStatus=1 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=3 bufferChar=115 sp_dataString= sp_startMarkerStatus=1 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=4 bufferChar=115 sp_dataString= sp_startMarkerStatus=1 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=5 bufferChar=115 sp_dataString= sp_startMarkerStatus=2 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=2 bufferChar=115 sp_dataString= sp_startMarkerStatus=2 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=3 bufferChar=112 sp_dataString= sp_startMarkerStatus=2 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=4 bufferChar=112 sp_dataString= sp_startMarkerStatus=2 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=5 bufferChar=112 sp_dataString= sp_startMarkerStatus=3 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=2 bufferChar=112 sp_dataString= sp_startMarkerStatus=3 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=3 bufferChar=109 sp_dataString= sp_startMarkerStatus=3 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=4 bufferChar=109 sp_dataString= sp_startMarkerStatus=3 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=5 bufferChar=109 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=2 bufferChar=109 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=3 bufferChar=52 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=8 bufferChar=52 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=0 sp_packetAvailable=0 step=9 bufferChar=52 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=52 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=118 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=118 sp_dataString= sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=118 sp_dataString=v sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=118 sp_dataString=v sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=101 sp_dataString=v sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=101 sp_dataString=v sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=101 sp_dataString=ve sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=101 sp_dataString=ve sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=114 sp_dataString=ve sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=114 sp_dataString=ve sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=114 sp_dataString=ver sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=114 sp_dataString=ver sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=63 sp_dataString=ver sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=63 sp_dataString=ver sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=63 sp_dataString=ver? sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=63 sp_dataString=ver? sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=101 sp_dataString=ver? sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=101 sp_dataString=ver? sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=101 sp_dataString=ver?e sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=101 sp_dataString=ver?e sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=115 sp_dataString=ver?e sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=115 sp_dataString=ver?e sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=115 sp_dataString=ver?es sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=115 sp_dataString=ver?es sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=112 sp_dataString=ver?es sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=112 sp_dataString=ver?es sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=112 sp_dataString=ver?esp sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=2 bufferChar=112 sp_dataString=ver?esp sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=3 bufferChar=109 sp_dataString=ver?esp sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=10 bufferChar=109 sp_dataString=ver?esp sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0 step=11 bufferChar=109 sp_dataString=ver?espm sp_startMarkerStatus=4 sp_stopMarkerStatus=0 sp_dataLength=52 sp_packetAvailable=0
можно сделать вывод о неправильном чтении длинны пакета, битый час сижу и не могу понять, что не так. Извеняюсь за горы кода, и заранее благодарю за помощь.
заменил Serial.print на Serial.write всё заработало как часы