Задумал сделать пакетную передачу данных 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 всё заработало как часы