Чтение байт BluetoothSerial, ESP32

Добрый день. Необходимо отправить запрос и вычитать ответ из nfc-ридера и перевести в String, подключение через bluetooth. Делаю так:

SerialBT.setTimeout(10);

String sendData = "4d004E2117100a004880AE8000420000000001000000000000000804000000000009802312010005E7C6C72200000000000000000000000000000000000000000000000000000000000000000000000000FE";

char SendDataC[fullSendData.length() + 1];
	sendData .toCharArray(SendDataC, sendData .length() + 1);
	sendData = "";

	uint8_t sendData_Hex[strlen(SendDataC) / 2] = {};
	memset(sendData_Hex, 0, sizeof(sendData_Hex));


String btAnswer= "";

SerialBT.write(sendData_Hex, sizeof(sendData_Hex));

byte btAnswerChr[512];
    uint8_t counter = 0;

while (SerialBT.available() > 0) {

    char ch = SerialBT.read();

/*
    Serial.print ("Get byte: ");
	
    Serial.print (counter);
    Serial.print ("---");
	

    Serial.print (ch,HEX);
    Serial.println ("");
	
  */

btAnswerChr[counter] = ch;
    counter++;
}

String result="";	

Serial.print ("counter: ");
  Serial.println (counter);
	
	for (int i = 0; i<=counter-1; i++)
	{
		if (convert.decimalToHexa(btAnswerChr [i]).length()==1)
			result+="0";
		
		result+=convert.decimalToHexa(btAnswerChr [i]);
		
	}
	
	memset(btAnswerChr, 0, sizeof(btAnswerChr));

Serial.print (result);

Если блок

    Serial.print ("Get byte: ");
	
    Serial.print (counter);
    Serial.print ("---");
	

    Serial.print (ch,HEX);
    Serial.println ("");

Раскомментировал все вычитывается правильно:

7081A657135167803202840547D24112010000000001960F5A0851678032028405475F24032411305F25031911015F280208045F3401018C279F02069F03069F1A0295055F2A029A039C019F37049F35019F45029F4C089F34039F21039F7C148D0C910A8A0295059F37049F4C088E0E000000000000000042031E031F039F0702FFC09F080200029F0D05B4508400009F0E0500000000009F0F05B4708480009F420209809F4A01829000

если закомментирован, почему-то вычитывается только часть:

95055F2A029A039C019F37049F35019F45

При этом counter = 17

Можно предположить, что print() придерживает while() и все байты успевают прилететь в буфер.

Ведь available() нигде не сравнивается с необходимым кол-вом байт, а значит будет обработано случайное их количество.

спасибо за ответ, а как сравнивать available(), если количество байт заранее неизвестно?..

Вы же как-то определяете - правильно вычиталось или нет. Опирайтесь на этот признак.

Есть байт контрольной суммы. он идет 4м, получаю его, например AB и дальше

while (SerialBT.available() < 171)

верно?

Может и правильно. Я же не знаю, куда эта строка пойдёт и действительно ли 171 байт в посылке.

я про общий принцип…

Общий принцип - принимать до конца фрейма. Определяется ли он по длине, терминатору или ещё как-то - следует из технического описания прибора- посылальщика.

Рассказать про “общий принцип” Вашего кода? Почему он весь - наваленные друг на друга мины, которые обязательно рванут, не сейчас, так потом? Просто не могут не рвануть? Или это флуд не по сути заданного вопроса?

не для ТС так для сообщества будет интересно