Передать по serial массив данных (word)

Тема в разделе "Проводная и беспроводная связь", создана пользователем Ariadna-on-Line, 27 фев 2021.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    получаю массив данных типа word или int ( слов - короче размером два байта на данное) из АЦП Ардуины. Например получено 1000 слов. Требуется передать быстрейшим способом по сериалу. Вроде бы есть способ пакетной передачи. То есть передавать массив за один вызов функции. Не покажет ли кто кусок такого кода. Желательно чтобы плоттер Ардуиновский понимал.
    С уважением.
     
    Последнее редактирование: 27 фев 2021
  2. parovoZZ

    parovoZZ Гуру

    Быстрейшим способом в отсутствие DMA - это через прерывания и конечный автомат. При том, что АЦП у AVR не такой и быстрый, то можно сразу же и отправлять. Я где-то показывал, как передавал данные с АЦП по сериал в цомпкутер. Частота семплирования была что-то порядка 70 000 байт в секунду. Скорость USART 200 000 бод.
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    По каким фразам, хотя бы, это искать ?
     
  4. parovoZZ

    parovoZZ Гуру

  5. AlexU

    AlexU Гуру

    Код (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();    // 'перевод строки' -- разделитель пакетов
     
     
    Ariadna-on-Line нравится это.
  6. Asper Daffy

    Asper Daffy Иксперд

    Код (C++):
    unsigned kaka[1000];
    .....
    Serial.write(kaka, sizeof(kaka));
    Если по штатному сериалу, то так. А если "быстрейшим способом", то надо свой сериал написать на отправку - там немного, но надо.
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Нет нужды ускорять сериал. Там и так достаточно. Надо немного другое.
    Требуется передать 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));

    в "наборе" - нет. Надеюсь понятно объясняю.
     
    Последнее редактирование: 28 фев 2021
  8. KindMan

    KindMan Гуру

    Вы же столько всего пишете, программы выкладываете, а с этим вопросом сюда обратились. АЦП то как раз и считывает старший и младший байт, и соединяет их, а вы сразу пихайте их в массив.
    Или я не понимаю
     
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    АЦП - аналого-цифровой преобразователь. Он ниоткуда ничего не считывает. Он ВЫДАЕТ. Выдает сразу 10-разрядное число.
    ПС. Вы меня не путаете ни с кем ? Я везде подчеркиваю, что в Си не спец. Выкладывать программы на Си - благоразумно не пытаюсь. И вообще - я схемотехник, а не програмЁр. А вы - выложили бы код, а не слова.
     
    Последнее редактирование: 28 фев 2021
  10. parovoZZ

    parovoZZ Гуру

    Какие проги? Считывай с АЦП отдельно младший байт, отдельно старший байт. А ещё лучше два младших бита выкинуть (они всё-равно кривые и никакой информации не несут) и работать с одним байтом.
     
  11. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. ЧТО лучше выкинуть - сам знаю и советов не прошу.
    2. Не стал грузить лишним, но наверно зря. Итак. Требуется с максимальной скоростью цифровать. По-умолчанию, АЦП за один цикл выдает 10-разрядов, и за ОДИН такт мы их должны сохранить в массиве двух-байтной "ширины". Никаких "по-отдельности" во время оцифровки быть не должно. Это замедляет. Все операции проводим с буфером (с массивом) ПОСЛЕ заполнения. А вот здесь, рутины сортировки на мл./ст. байты хотелось бы избежать. Ведь физически байты и так уже лежат в памяти как требуется (если я правильно понимаю). По-сути надо только шаг индекса массива поменять с 2 на 1.
     
    Последнее редактирование: 28 фев 2021
  12. akl

    akl Гуру

    Код (C++):
    uint16_t acparr[100];
    uint8_t *parr;
    parr=(uint8_t *)acparr;
    вроде должно работать
     
  13. parovoZZ

    parovoZZ Гуру

    На AVR не получится.

    ЧТО ЗАМЕДЛЯЕТ? Максимальная частота тактирования АЦП - 1 МГц при 8-ми битном результате. Если хочется снимать 10 бит, то тактовая частота не должна превышать 200 кГц. Весь цикл преобразования занимает 15 тактов АЦП. Итого мы имеем, что при частоте CPU в 20МГц между преобразованиями у нас в запасе более 1000 тактов CPU. За эти 1000 тактов можно хоть чёрта лысого подстричь, не то, что по UART передать.
     
  14. KindMan

    KindMan Гуру

    Извините, но опять таки не ясно где нужна скорость, здесь
    или здесь
    Один цикл это сколько тактов?
    Вам важно полученное число (два байта!) за один такт положить в память, но при этом вы хотите analogRead что-ли воспользоваться? Нестыковка.
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Требуется быстрейшим способом ВСЁ. Че непонятного. Затык в "лишних телодвижениях" по перелопачиванию старших-младших байтов.
    ПС. Главное что, решение есть. Там как-то хитро "обманывают" компилятор.
     
  16. parovoZZ

    parovoZZ Гуру

    Смени битность МК.

    где там и кто?
     
  17. SergeiL

    SergeiL Оракул Модератор

    Вам же написали
    Код (C++):
    unsigned kaka[1000];
    ......
    Serial.write(( char *) kaka, sizeof(kaka));
    Компилятор же пишет что ему не нравится.
    Сделайте явное преобразование данных.
     
    Ariadna-on-Line нравится это.
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    SergeiL-у - Большое спасибо. Все как надо. Коротко и изящно.
     

    Вложения:

  19. Asper Daffy

    Asper Daffy Иксперд

    Ну, Вы блин, даёте, вроде не первый день замужем. Так преобразуйте эту каку в указатель на байт, делов-то! Даже не дуумал, что это может быть проблемой
    Код (C++):
    unsigned kaka[100];
    ...
    Serial.write((uint8_t *)kaka, sizeof(kaka));
     
  20. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не знаю нужные команды из синтаксиса Си. Пардонс. Моя стихия - электроника и химия.
    Всем спасибо.
     
    Последнее редактирование: 2 мар 2021