wifiUdp - Отправка пакетов массивом

Здравствуйте
помогите плиз разобраться.
каждый 125 мкс за собираю данные с аналогового входа, фомирую покеты и хочу отправить их по udp. К сожалению отпавка не происходит. Пробую отправлять по одному байт, то все ОК. Пробую отправять строку типа char packet[данные для отрравки] - тоже хорошо отрпвляется. Мне кажется что как-то неправильно складываются данные в массив типа char. Подскажите плиз где мжоет быть проблема?

#include <WiFiUdp.h>
char buf[256];


IPAddress ip(192,168,0,124);
WiFiUDP Udp;
unsigned int localUdpPort = 4210;  

void setup() {
  // put your setup code here, to run once:

}
int i=0;
void loop()
{
    buf[i]=char(analogRead(A0)/4);
    
    i++;
    delayMicroseconds(125);  //125-8kb
 
        if (i==255) {
          Udp.beginPacket(ip, localUdpPort);
          Udp.write(buf);
          Udp.endPacket();
           
          i=0;
    }  
}

Если данные укладываются в char, то проблем нет.

Почитайте описание метода write()

это отправка одного байта.

Чтобы отправить целый пакет, надо указать его размер:

Udp.write(buf, 256);

Да, я читал ,

но к сожалению не проходит у меня и этот вариант.
Однозначно проходит только так:

void loop()
{

     // int val = map(analogRead(A0), 0, 1023, 0, 255);
     // buf[i] = char(val); 
    
    buf[i] = char(i);   
    i++;
    delayMicroseconds(125);  //125-8kb

    if (i==255) {
      Udp.beginPacket(ip, localUdpPort);     
      for (int j = 0; j < 256; j++)  Udp.write(buf[j]);
      Udp.endPacket();
      i=0;
    }
}

, отлично отправляет пакеты, но формирование происходит перед отправкой

если включаю вот это

     // int val = map(analogRead(A0), 0, 1023, 0, 255);
     // buf[i] = char(val); 

пакеты не отправляются даже по одному байту

Не могу разобраться что не так. может у себя кто-нить попробует.

А какой диапазон значений у char?

что именно не проходит? Покажите сообщения об ошибке.

какого фига вы свои данные описали как char?
Почему не байт?

вот прям из этого файла, который вы “читали”

size_t write(const uint8_t *buffer, size_t size) override;

какой тип у буфера данных команды write ? Разве char?

хороший вопрос. счс посмотрел и окончательно запутался

Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.

Ок, тогда начну сначала, может быть вы мне скажете где я неправильно думаю.Итак, Я имею дело с esp8266, у него 10бит ADC, analogRead() должен вернуть от 0 до 1023, 10 бит мне ни к чему , достаточно 8бит, поэтому в одном коде я подсмотрел что делили на 4. приводя диапазон как бы к 8битам. Яникгде не нашел инфо какой тип данных возвращает analogRead лишь подозревая что это Int, Но наткнулся на функцию map. вот ее и применил. А теперь я вижу ,что диапазон char - это от -127 до 127. Но ,как японимаю это мне совсем не подходит?

потому что отправка

char packet[]="данные для отправки"

проходила на ура, и я подумал что нужно копать именно в этом направлении.

ОК, как правильно нужно делать? Я могу счас попробовать на байт перебить, не уверен ,что это будет быстро. Но можно попробовать

// Write a single byte into the packet
size_t write(uint8_t) override;
// Write size bytes from buffer into the packet
size_t write(const uint8_t *buffer, size_t size) override;

в документации на wifiupd.h вообще вот это.

Это метод для символьной строки. Он отправляет не весь буфер, а до первого нуля замените на write(buf, sizeof(buf));

Нет, нуль-терминированной строки. Вот она:

    size_t write(const char *str) {
      if (str == NULL) return 0;
      return write((const uint8_t *)str, strlen(str));
    }

описать свой буфер как байт. Больше НИЧЕГО МЕНЯТЬ НЕ НАДО

Преобразования только в чар свои выкиньте, они не нужны.

Не только, будьте внимательнее. Там ещё:

using Print::write;

Евгений, Вы ошибаетесь. В сообщении 4 ссылка на исходник библиотеки, посмотрите.

Да, нет, Вы. Сами и смотрите в исходник (я там комментарии добавил)

size_t write(uint8_t) override; // не подходит, т.к. у ТС не char, а массив
// Write size bytes from buffer into the packet
size_t write(const uint8_t *buffer, size_t size) override; // не подходит, параметров много
  
using Print::write; // ВО!!! А вот там и сидит тот метод, что я Вам привёл, см. в поставке IDE. Он и используется.

Ага, вот именно в такой последовательности. Сначала единичный байт, потом буфер, а потом уже строка и прочее, если там еще что-то есть в классе принт

Поэтому ваше слово “нет” здесь не подходит:

Пока идут дебаты по поводу типов данных, хочу обратить внимание на то, что представленный код работает совсем не так, как описано:

  • analogRead - 112 мкс,
  • delay - 125 мкс,
  • несколько арифметических операций над двухбайтовыми величинами - N мкс,
  • beginPacket + write + endPacket - мне даже страшно представить, сколько это в микросекундах…

Посмотрите для оценки:

@ЕвгенийП
Хотя если наш ТС пытался таким образом

отправить весь буфер, то конечно Вы правы и исполнялся вариант write() для строки из класса Принт

Последний пункт включать не нужно, операции с пакетами у ТС выполняются только после чтения 256 значений с аналогового входа.

Но ТС должен отдавать себе отчет, что пауза между оправкой пакетов существенно больше не только интервала времени меду измерениями, но и интервала времени, за которое формируется целый пакет.
Т.е. фрагменты с частотой опроса 4 кГц - короткие, а паузы между ними (когда измерения не проводятся) - длинные.