Tcp сервер

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 8 ноя 2022.

  1. передаю команду на ардуину из компьютера (запрос из 2 байт)
    ардуина этот код принимает и отправляет ответ (19 байт)
    ответ содержит айпи адрес ардуины, код ответа (2 байта) и 8 байт данных ответа.
    компьютер пакет принимает той же длины, что и отправлялось, но.... часть пакета после айпи адреса и кода отправки, то верная, то нет (сравнение по составу пакета). как такое может быть?
    Код (C++):
    if (client)
          {  
              if (client.connected())
              {
                  if (client.available())
                  {
                      size_t InBufLenght = client.available();
                      byte buf[InBufLenght];
                      byte buf2[20];
                      int y = client.read(buf, InBufLenght);
                      //server.write(1,1);
                      delay(20);        
                      Serial.print("Получил пакет ");
                   
                      if (buf[0] == 138 && buf[1] == 164) //
                      {
                          Serial.println("поступил запрос");
                          //uint8_t Abuf[15];
                          for (int q = 0; q < 4; q++) buf2[q] = myip[q];
                          buf2[4] = 34;
                          buf2[5] = 52;
                          //Serial.println(gra_oborot);
                          IntToHEX(gra_oborot);
                          for (int q = 0; q < 4; q++) buf2[q + 6] = DataSl[q];
                          //Serial.println(him_oborot);
                          IntToHEX(him_oborot);
                          for (int q = 0; q < 4; q++) buf2[10 + q] = DataSl[q];
                          for (int q = 0; q < 20; q++)
                          {
                            Serial.print(buf2[q]);
                            if (q < 19)
                              Serial.print(";");
                            else
                              Serial.println("");
                          }
                          server.write(buf2, 20);
                          delay(50);
                          for (int i = 0; i < 20; i++)
                          {
                            buf2[i] = i;
                          }
                          server.write(buf2, 20);
                          for (int q = 0; q < 20; q++)
                          {
                            Serial.print(buf2[q]);
                            if (q < 19)
                              Serial.print(";");
                            else
                              Serial.println("");
                          }
                          server.write(buf2, 20);
                        /*  udp.beginPacket(udp.remoteIP(), 355);//Udp.remotePort()
                          udp.write(Abuf, 15);
                          udp.endPacket();*/

                          Serial.println("ответ отправлен");
                      }
                      else

    void IntToHEX(uint32_t x)
    {
      DataSl[0] = x & 0xFF;
      DataSl[1] = (x >> 8) & 0xFF;
      DataSl[2] = (x >> 16) & 0xFF;
      DataSl[3] = (x >> 24) & 0xFF;
    }

     
     
  2. parovoZZ

    parovoZZ Гуру

    Значит, и такое может быть.
     
  3. User248

    User248 Гик

    Прикрутить к данным контрольную сумму. Если не совпадает, то повторить отправку.
     
  4. parovoZZ

    parovoZZ Гуру

    В tcp пакете она уже есть
     
  5. b707

    b707 Гуру

    у вас, Михаил, и не такое может быть....