Мне нужна помощь в получении данных с двух разных датчиков в программировании на языке Си

#c #embedded #freertos #task-queue

Вопрос:

Таким образом, у меня в основном есть датчик температуры и фоторезистор, и я пытаюсь понять, как разделить значения, которые я получаю. Это то, что я делал до сих пор:

 #define type_temp 0   #define type_photo 1  typedef struct AMESSAGE{    char type;  uint8_t adc;  } AMESSAGE;  

Я попытался определить два разных типа данных и назначить их каждому АЦП в моем проекте. Затем я попытался вызвать эти два разных типа в своем проекте, и это не сработало. Мне интересно, что я делаю не так. Мое лучшее предположение заключается в том, что я неправильно создаю структуру.

 void MyTask1(void *pvParameters) {    AMESSAGE xMessage;  uint8_t adc;  uint8_t adc1;  int16_t vin;  int16_t vin1;  char str[80];    ADC_StartConvert();  ADC1_StartConvert();    while(1){  if (ADC_IsEndConversion(ADC_RETURN_STATUS)){ //ADC_WAIT_FOR_RESULT) ){  adc = ADC_GetResult8();  vin = ADC_CountsTo_mVolts(adc);   xMessage.adc = adc;       while ( xQueueSendToBack(xQueue, amp;xMessage.adc, pdMS_TO_TICKS(10)) != pdPASS){};    }   vTaskDelay( pdMS_TO_TICKS(20)); // Delay for 20ms       if (ADC1_IsEndConversion(ADC1_RETURN_STATUS)){ //ADC_WAIT_FOR_RESULT) ){  adc1 = ADC1_GetResult8();  vin1 = ADC1_CountsTo_mVolts(adc1);   xMessage.adc = adc1;       while ( xQueueSendToBack(xQueue, amp;xMessage.adc, pdMS_TO_TICKS(10)) != pdPASS){};    }   vTaskDelay( pdMS_TO_TICKS(20)); // Delay for 20ms   } }  

Комментарии:

1. Вы пробовали получать данные только с одного из датчиков? Заставьте это работать, сделайте то же самое для другого датчика самостоятельно, а затем попробуйте как-то объединить их.

2. Привет, да, у меня оба датчика работают индивидуально, я просто не понимаю, как разделить данные, также большое вам спасибо за ответ.

3. Вам придется сделать сообщения разными, например, установив aMessage.type на что-то другое для каждого датчика, я бы предположил, что это то, для чего type_temp и type_photo предназначены. К вашему сведению, общее соглашение состоит в том, чтобы сделать константы, подобные этим, всеми заглавными буквами, и использовать перечисление.

Ответ №1:

У вас уже есть type поле в AMESSAGE структуре. После преобразования установите для него желаемое значение — type_temp или type_photo (я предполагаю, что первый if правильно получает данные с одного датчика, второй — с другого). Затем отправьте все xMessage в очередь, а не только результат АЦП

 xQueueSendToBack(xQueue, amp;xMessage, pdMS_TO_TICKS(10));  

Очередь должна быть создана с sizeof(AMESSAGE) учетом размера элемента.