Здравствуйте
помогите плиз разобраться.
каждый 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 занимает в памяти 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;
Да, нет, Вы. Сами и смотрите в исходник (я там комментарии добавил)
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. Он и используется.
Но ТС должен отдавать себе отчет, что пауза между оправкой пакетов существенно больше не только интервала времени меду измерениями, но и интервала времени, за которое формируется целый пакет.
Т.е. фрагменты с частотой опроса 4 кГц - короткие, а паузы между ними (когда измерения не проводятся) - длинные.