Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511

FreeRTOS проблема при передаче данных с АЦП

01.09.2020, 14:15. Показов 3081. Ответов 5

Студворк — интернет-сервис помощи студентам
На stm32f746 discovery настроена FreeRTOS, есть несколько задач, одна из которых это оцифровка нескольких каналов АЦП, извлечение полученных данных DMA и последующая их передача по USART и по LWIP. По LWIP все передается правильно, все 4 значения 12 битного АЦП. А вот по USART передается только первое значение, а остальные три передаются нулями. Подозреваю, что ошибка в задаче передачи по USART. Может кто подскажет где она
Задача АЦП:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void StartAdcTask(void const * argument)
{
  /* USER CODE BEGIN StartAdcTask */
  /* Infinite loop */
  //-------------------------------------------------------
  volatile uint16_t adcDataBuf[4] = {0,0,0,0};
  for(;;)
  {
      for (uint8_t num = 0; num < 4; num++)
      {
          adcDataBuf[num] = 0;     // На всякий случай перед оцифровкой обнуляем adcDataBuf
      }
 
      HAL_ADC_Start_DMA(&hadc3, (uint16_t*)&adcDataBuf, 4);    // Старт АЦП
 
      xSemaphoreTake(binary_semaphore_2, portMAX_DELAY);     // Семафор срабатывает, когда DMA забрал массив данных  
      HAL_ADC_Stop_DMA(&hadc3);
      struct struct_adc_t AdcDataStruct;
      for (uint8_t i = 0; i < 4; i++)
          {
            AdcDataStruct.adc_str[i] = adcDataBuf[i];
          }
          xQueueSend(adc_Queue, &AdcDataStruct, portMAX_DELAY);    // Очередь передачи данных LWIP
      xQueueSend(send_data, &adcDataBuf, portMAX_DELAY);         // Очередь передачи данных USART
 
      osDelay(1000);
  }
  //-------------------------------------------------------
  /* USER CODE END StartAdcTask */
}
Прерывание от DMA:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
    if(hadc->Instance == ADC3)
    {
        xSemaphoreGiveFromISR(binary_semaphore_2,&xHigherPriorityTaskWoken);
        portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
    }
    else
    {
        __NOP();
    }
}
Задача отправки данных по USART:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void StartUsartTask(void const * argument)
{
  /* USER CODE BEGIN StartUsartTask */
  /* Infinite loop */
  //-------------------------------------------------------
  uint16_t adcSendData[4] = {0,0,0,0};           // ADC send data
  uint8_t k = 0;
  for(;;)
  {
      // USART sending ADC data
      if (xQueueReceive(send_data, &adcSendData, portMAX_DELAY) == pdTRUE)
      {
 
      for (k = 0; k < 4; k++)   // Отправляем 4 значения АЦП по очереди, ошибка, видимо, в этом цикле
      {
          snprintf(trans_str, 16, "%d\r\n", adcSendData[k]);         
          HAL_UART_Transmit(&huart1, (uint8_t*)trans_str, strlen(trans_str), 100);
      }
      }
      osDelay(1);
  }
  //-------------------------------------------------------
  /* USER CODE END StartUsartTask */
}
Добавлено через 3 часа 26 минут
Для примера, что получаю по LWIP:
DataRes1: 3804
DataRes2: 3820
DataRes3: 3812
DataRes4: 3815
Что получаю по USART:
3804
0
0
0
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2020, 14:15
Ответы с готовыми решениями:

Проблема при передаче данных через RS232 - Wi-Fi
Устройство с интерфейсом RS232 подключено через Wi-Fi удлинитель WiBOX...

Проблема с получением привязанных данных при передаче готового объекта
все привет.Помогите разобраться У меня есть главная форма. По кнопке вызывается форма 2 на которой пользователь вносит данные. ...

Проблема с кодировкой при передаче данных через Microsoft ODBC Driver 17
При передаче данных через драйвер Microsoft ODBC Driver 17 for SQL из юниксойда в ms sql не пишется кириллица. На ms sql 13.0.1742.0...

5
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
01.09.2020, 18:18
где и как объявлена trans_str?
0
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
01.09.2020, 18:52
Привет.
Как ты создавал очередь send_data?
Если ты задал размер элемента в 2 байта, например вот так
C
1
send_data = xQueueCreate(4, sizeof(uint16_t) );
то при вызове
C
1
xQueueSend(send_data, &adcDataBuf, portMAX_DELAY);         // Очередь передачи данных USART
в очередь будет помещаться только одно значение АЦП.
И соответственно выбираться будет тоже только одно, а остальные три будут оставаться такими же как при объявлении переменной - нулями
C
1
uint16_t adcSendData[4] = {0,0,0,0};
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
01.09.2020, 19:14  [ТС]
ValeryS,
Цитата Сообщение от ValeryS Посмотреть сообщение
где и как объявлена trans_str?
Перед int main
C
1
char trans_str[32] = {0};
Добавлено через 4 минуты
yatrim,
Цитата Сообщение от yatrim Посмотреть сообщение
Как ты создавал очередь send_data?
Да, именно так как Вы написали
C
1
2
xQueueHandle send_data;
send_data = xQueueCreate(4, sizeof(uint16_t));
Но почему в очередь помещается только одно значение 12 битного АЦП, если я создаю 4 ячейки по 16 бит каждая?
Или я так понимаю, что я создал 4 ячейки, а используется для помещения и приема данных только одна, тогда вопрос, как поместить все 4 значения за раз и считать их тоже за раз?
0
76 / 52 / 26
Регистрация: 23.01.2019
Сообщений: 134
01.09.2020, 20:10
Лучший ответ Сообщение было отмечено DmitryDDDD как решение

Решение

Второй параметр функции xQueueCreate - это размер элемента, который помещается в очередь вызовом xQueueSend.
У тебя этот параметр равен sizeof(uint16_t), то есть 2 байта. Соответственно при вызове xQueueSend в очередь и передаются только два байта. В таком случае, чтоб поместить и считать четыре элемента массива, нужно четыре раза вызывать xQueueSend и xQueueReceive для каждого из них.
А чтоб за один раз передать и принять весь массив из четырех элементов следует создать очередь так:
C
1
2
xQueueHandle send_data;
send_data = xQueueCreate(1, sizeof(uint16_t)*4);
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
02.09.2020, 06:30  [ТС]
yatrim, Спасибо, все заработало, не знал о таких тонкостях. А если я использую такой тип очереди
C
1
2
3
4
5
6
7
osMessageQId adc_Queue;
#define MAIL_ADC_SIZE (uint16_t) 4
uint16_t adc_str[4];
osMessageQDef(stradcqueue, MAIL_ADC_SIZE, struct_adc);          
adc_Queue = osMessageCreate(osMessageQ(stradcqueue), NULL);
 
xQueueSend(adc_Queue, adc_str;, portMAX_DELAY);
То здесь сразу все 4значения массива будутпереданы в очередь и считаны?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2020, 06:30
Помогаю со студенческими работами здесь

Проблема при "передаче" данных в гистограму
Проблема: При &quot;передаче&quot; даных в гистограму (this.chart2.Series.Points.AddXY(ch, d);)

Работа АЦП по таймеру во FREERTOS stm32
Столкнулся с такой проблемой: не работает АЦП по таймеру во FREERTOS. Есть проект, сгенерированный в CubeMX, там настроено: FREERTOS, LWIP,...

Проблема при передаче файлов
Здравствуйте, передаю строку, некоторое сообщение, затем пытаюсь передать ряд файлов с клиента на сервер. Сервер в свою очередь пишет файлы...

STM32F1 АЦП. Проблема с регистром данных
Доброго времени суток! Пытаюсь запустить АЦП1 в режиме непрерывном режиме с регулярными каналами: по переполнению таймера возникает...

Проблема с объединением сообщений при передаче по TCP
Вообщем делаю регистрацию и авторизацию клиента на сервере. Клиент: private void button1_Click(object sender, EventArgs e) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru