#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)
учетом размера элемента.