@yaponchik

Как правильно работать с объединением UNION в Си?

ADUC814 управляет АЦП AD7793 и передает по RS232 данные на другой МК AT89C51.
Раньше я оперировал только 3-мя байтами, принимал их и передавал таким образом:
union
    {
        unsigned long uD;
        unsigned char uData[4];
    } uDataUnion;
char i = 0;
uDataUnion.uData[0] = uDataUnion.uData[1] = 
uDataUnion.uData[2] = uDataUnion.uData[3] = 0x00;
for (i = 1; i <= 3; ++i)
    { 
        SPIDAT = 0x00;
        while (!ISPI);
        uDataUnion.uData[i] = SPIDAT;  // запоминает принятый от AD7793 очередн. байт
        ISPI = 0;   
    }
for (i = 3; i >= 0; --i)
    {
        Putc(kGainUnion.kGainArr[i]);
    }

Экспериментальным путем я выяснил, что корректно "склеиваются" данные только, когда мы в объединении обнуляем нулевой элемент массива, а байты записываем с 1-ого по 3-ий, т.е. фактически для 3-ех байтного числа я использовал 4-ех байтное.

Теперь к вопросу.
На данном этапе мне понадобилось осуществить предварительную обработку кодов АЦП перед отправкой:
union
    {
        unsigned long int kGain;
        unsigned char kGainArr[4];
    } kGainUnion;
kGainUnion.kGain = ((2147483648 - pow(2, (31-gain))) + (uDataUnion.uD * pow(2, (7-gain))));

результат данной операции занимает 4 байта, соответственно для его корректной "склейки" мне необходим 5-ый байт, равный 0х00.
KEIL C51 не может оперировать данными более 4 байт, соответственно возникает проблема передачи. Как мне все это провернуть по проще? и Почему UNION некорректно работает, т.е. приходится
  • Вопрос задан
  • 1268 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Не совсем понятно что вы подразумеваете под "склейкой" и какова в итоге задача.
Я так понимаю, вы читаете из AD7793 три байта, сохраняете их. Потом трактуете эти три байта как 32-битное значение (старшие 8 бит - нули), производите над ними мат.операции и куда-то отправляете результат?
Ответ написан
@baybak
Электронщик-програмист
Проверьте, корректно работает компилятор с нулевым элементом массива. На pic- компиляторах для 64-битных машинах такая проблема встречается.
Можно работать через указатель (char*)kGainUnion
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы