получаю массив данных типа word или int ( слов - короче размером два байта на данное) из АЦП Ардуины. Например получено 1000 слов. Требуется передать быстрейшим способом по сериалу. Вроде бы есть способ пакетной передачи. То есть передавать массив за один вызов функции. Не покажет ли кто кусок такого кода. Желательно чтобы плоттер Ардуиновский понимал. С уважением.
Быстрейшим способом в отсутствие DMA - это через прерывания и конечный автомат. При том, что АЦП у AVR не такой и быстрый, то можно сразу же и отправлять. Я где-то показывал, как передавал данные с АЦП по сериал в цомпкутер. Частота семплирования была что-то порядка 70 000 байт в секунду. Скорость USART 200 000 бод.
Код (C++): Serial.print("Channel_1:"); // имя канала без пробела Serial.print(channelsData[0] >> 8); // данные канала, старший байт первый Serial.print(channelsData[0]); Serial.print(','); // 'запятая' -- разделитель каналов Serial.print("Channel_2:"); Serial.print(channelsData[1]); Serial.print(','); Serial.print("Channel_3:"); Serial.print(channelsData[2]); Serial.println(); // 'перевод строки' -- разделитель пакетов
Код (C++): unsigned kaka[1000]; ..... Serial.write(kaka, sizeof(kaka)); Если по штатному сериалу, то так. А если "быстрейшим способом", то надо свой сериал написать на отправку - там немного, но надо.
Нет нужды ускорять сериал. Там и так достаточно. Надо немного другое. Требуется передать 10-битные данные (семплы) с АЦП. Коль 10 бит, значит каждый семпл занимает 2 байта (word - слово). Объявляем word- массив для 1000 семплов word sensorValue[1000]; // variable to store the value coming from the sensor В памяти это будет видимо цепочка - мл.байт(0), ст.байт(0), мл.байт(1), ст.байт(1),..мл.байт(999), ст.байт(999). Как эту цепочку байт прогнать в сериал ? Использовать очень удобную для моей цели функцию Serial.write(kaka, sizeof(kaka)); компилятор не дает, тк требует данные размером byte. Использовать проги разбиения слов на ст./мл. байты, с загонянием в byte-массив - Требуют дофига времени, те противоречат исходной цели. Функции типа Serial.print(kaka, sizeof(kaka)); в "наборе" - нет. Надеюсь понятно объясняю.
Вы же столько всего пишете, программы выкладываете, а с этим вопросом сюда обратились. АЦП то как раз и считывает старший и младший байт, и соединяет их, а вы сразу пихайте их в массив. Или я не понимаю
АЦП - аналого-цифровой преобразователь. Он ниоткуда ничего не считывает. Он ВЫДАЕТ. Выдает сразу 10-разрядное число. ПС. Вы меня не путаете ни с кем ? Я везде подчеркиваю, что в Си не спец. Выкладывать программы на Си - благоразумно не пытаюсь. И вообще - я схемотехник, а не програмЁр. А вы - выложили бы код, а не слова.
Какие проги? Считывай с АЦП отдельно младший байт, отдельно старший байт. А ещё лучше два младших бита выкинуть (они всё-равно кривые и никакой информации не несут) и работать с одним байтом.
1. ЧТО лучше выкинуть - сам знаю и советов не прошу. 2. Не стал грузить лишним, но наверно зря. Итак. Требуется с максимальной скоростью цифровать. По-умолчанию, АЦП за один цикл выдает 10-разрядов, и за ОДИН такт мы их должны сохранить в массиве двух-байтной "ширины". Никаких "по-отдельности" во время оцифровки быть не должно. Это замедляет. Все операции проводим с буфером (с массивом) ПОСЛЕ заполнения. А вот здесь, рутины сортировки на мл./ст. байты хотелось бы избежать. Ведь физически байты и так уже лежат в памяти как требуется (если я правильно понимаю). По-сути надо только шаг индекса массива поменять с 2 на 1.
На AVR не получится. ЧТО ЗАМЕДЛЯЕТ? Максимальная частота тактирования АЦП - 1 МГц при 8-ми битном результате. Если хочется снимать 10 бит, то тактовая частота не должна превышать 200 кГц. Весь цикл преобразования занимает 15 тактов АЦП. Итого мы имеем, что при частоте CPU в 20МГц между преобразованиями у нас в запасе более 1000 тактов CPU. За эти 1000 тактов можно хоть чёрта лысого подстричь, не то, что по UART передать.
Извините, но опять таки не ясно где нужна скорость, здесь или здесь Один цикл это сколько тактов? Вам важно полученное число (два байта!) за один такт положить в память, но при этом вы хотите analogRead что-ли воспользоваться? Нестыковка.
Требуется быстрейшим способом ВСЁ. Че непонятного. Затык в "лишних телодвижениях" по перелопачиванию старших-младших байтов. ПС. Главное что, решение есть. Там как-то хитро "обманывают" компилятор.
Вам же написали Код (C++): unsigned kaka[1000]; ...... Serial.write(( char *) kaka, sizeof(kaka)); Компилятор же пишет что ему не нравится. Сделайте явное преобразование данных.
Ну, Вы блин, даёте, вроде не первый день замужем. Так преобразуйте эту каку в указатель на байт, делов-то! Даже не дуумал, что это может быть проблемой Код (C++): unsigned kaka[100]; ... Serial.write((uint8_t *)kaka, sizeof(kaka));