Arduino + ccnet

Приветствую. Делаю реализацию ccnet протокола купюрника на Arduino, данные отправляются и приходят нормально, но есть один затык - купюрник, судя по всему, отправляет ответ частями и ответ на первый запрос получаю после того, как отправил второй. Пробовал делать ожидание, но почему-то ничего не приходит. Код:

const uint8_t CMD_IDENT[] = {0x02, 0x03, 0x06, 0x37};
const uint8_t CMD_BILL_TABLE[] = {0x02, 0x03, 0x06, 0x41};

 void getCashData()
{

  uint8_t pack_size_hex = 0;
  long pack_size = 0;

  if (ccnetSerial->available())
  {
    uint8_t code = ccnetSerial->read();
    uint8_t device_type = ccnetSerial->read();
    pack_size_hex = ccnetSerial->read();

    pack_size = convert.hexaToDecimal(String(pack_size_hex, HEX));

    Serial.print("size of pack: ");
    Serial.print(pack_size_hex, HEX);
    Serial.print("---");
    Serial.println(pack_size);

  }

  int psz = 0;

  while (psz <= pack_size)
  {


    psz += 1;
    int getByte = ccnetSerial->read();


    Serial.print(getByte, HEX);
    Serial.print("--");
    Serial.print(psz);
    Serial.print("--");
    Serial.print(pack_size);
    Serial.println("");

    if (getByte == -1)
    {

      delay (5000);
      
      getByte = ccnetSerial->read();
    }

    if (psz == pack_size)
      break;

  }
  Serial.println("*************");
}

void loop() {

      Serial.println("CMD_IDENT: ");
      sendCommand(CMD_IDENT, sizeof(CMD_IDENT));
      delay (1000);
      getCashData();

      delay (5000);

      Serial.println("CMD_BILL_TABLE: ");
      sendCommand(CMD_BILL_TABLE, sizeof(CMD_BILL_TABLE));
      delay (1000);
      getCashData();

}

В ответ последовательный порт получаю:

CMD_IDENT: 
Send data: 02,03,06,37,FE,C7
size of pack: 27---39
4D--1--39
53--2--39
4D--3--39
2D--4--39
55--5--39
41--6--39
31--7--39
38--8--39
33--9--39
38--10--39
20--11--39
20--12--39
20--13--39
20--14--39
20--15--39
30--16--39
33--17--39
4B--18--39
42--19--39
34--20--39
30--21--39
30--22--39
33--23--39
38--24--39
39--25--39
32--26--39
31--27--39
27--28--39
68--29--39
FFFFFFFF--30--39
FFFFFFFF--31--39
FFFFFFFF--32--39
FFFFFFFF--33--39
FFFFFFFF--34--39
FFFFFFFF--35--39
FFFFFFFF--36--39
FFFFFFFF--37--39
FFFFFFFF--38--39
FFFFFFFF--39--39
*************


CMD_BILL_TABLE: 
Send data: 02,03,06,41,4F,D1
size of pack: 7D---125
5--1--125
55--2--125
4B--3--125
52--4--125
0--5--125
1--6--125
55--7--125
4B--8--125
52--9--125
1--10--125
2--11--125
55--12--125
4B--13--125
52--14--125
1--15--125
5--16--125
55--17--125
4B--18--125
52--19--125
1--20--125
1--21--125
55--22--125
4B--23--125
52--24--125
2--25--125
2--26--125
55--27--125
4B--28--125
52--29--125
FFFFFFFF--30--125
FFFFFFFF--31--125
FFFFFFFF--32--125
FFFFFFFF--33--125
FFFFFFFF--34--125
FFFFFFFF--35--125

Подскажите, как правильно вычитать данные в данном контексте?

Вот это что за чушь? Зачем нужно это преобразование?

pack_size = convert.hexaToDecimal(String(pack_size_hex, HEX));

Вы в курсе, что pack_size и pack_size_hex - для компьютера одно и то же?

По основному вопросу - вы читаете из порта данные, даже не проверяя, а есть ли они там. Например в строке 10 - вы проверили, что в буфере есть один байт, а прочитали три.
В строке 27 и того хуже - читаете из порта 125 байт, не проверяя, сколько там реально и есть ли там хоть один байт вообще.

Результат этого закономерный - вы читаете из порта ерунду.

1 лайк

@chiffa
ну что, поняли в чем ваши ошибки? Вам же несколько человек на arduino.cc сказали тоже самое.
Удивительно то, что год назад, когда вы спрашивали про Блютуз - у вас была ровно эта же проблема. Вам тогда уже указывали. что нельзя читать порт, не проверяя наличие данных.
Похоже что за год вы так ничему и не научились.

И в том, что такое DEC и HEX - вам тоже надо разобраться. Без понимания этого никакие протоколы с бинарными данными у вас реализовать не получится.

1 лайк