
Сообщение от
SoftFelix
Вот так заработает?
Есть одна небольшая ошибочка - лишняя точка с запятой в условии if (receivedByte != syncSuccess1986[numBytesReceived]). Это приведет к тому что в случае несовпадения байта выполнится пустая инструкция, а затем будет безусловный return false. Плюс кое-какие стилистические правки я добавил чтобы по возможности избавляться от "магических чисел" и дать возможность компилятору самому вычислять количество байт ответа основываясь на содержимом массива syncSuccess1986 - он обязательно должен быть типа byte иначе оператор sizeof вернет неправильное количество байт.
Код:
bool SYNC_1986_handshake()
{
while (Serial.available()) Serial.read();
for (int i = 0; i < 512; i++) {
Serial.write(0);
}
Serial.flush();
byte syncSuccess1986 [] = {0x0D, 0x0A, 0x3E}; //для проверки ответа от 1986ВЕ91
const int NumBytesToReceive = sizeof(syncSuccess1986); // количество байт которые ждем в ответ
int numBytesReceived = 0; // здесь храним количество принятых байт
for (int istep = 0; istep < 5; ++istep) // делаем несколько попыток считать ответ
{
while (Serial.available() && numBytesReceived < NumBytesToReceive) // читаем все что уже есть во входном буфере
{
byte receivedByte = Serial.read(); // можно сохранить это где нибудь чтобы проверить значение
if (receivedByte != syncSuccess1986[numBytesReceived]) //парсим принятый байт на правильное совпадение с ответом 1986
{
return false; //байт не совпал - выходим с ошибкой
}
++numBytesReceived; // храним количество принятых байт
}
if (numBytesReceived == NumBytesToReceive) // получили все что нужно
{
return true; // возвращаем успех
}
delay(10);
}
return false; // возвращаем неудачу
}