32-битное шестнадцатеричное число в C с простым вызовом функции - PullRequest
0 голосов
/ 29 июня 2018

Я хотел бы знать, смогу ли я обойтись без использования printf для печати 32-битных входящих двоичных данных из микроконтроллера в виде шестнадцатеричного числа. Я уже собрал биты в большую целочисленную переменную, и я пробую опцию «% x» в printf, но все, что мне кажется, это 8-битные значения, хотя я не могу сказать, является ли это ограничением для printf или моего микроконтроллера на самом деле возвращает это значение.

Вот мой код для получения данных с микроконтроллера:

 printf("Receiving...\n");
 unsigned int n=0,b=0;
 unsigned long lnum=0;
 b=iolpt(1); //call to tell micro we want to read 32 bits
 for (n=0;n<32;n++){
     b=iolpt(1); //read bit one at a time
     printf("Bit %d of 32 = %d\n",n,b);
     lnum<<1; //shift bits in our big number left by 1 position
     lnum+=b; //and add new value
 }
 printf("\n Data returned: %x\n",lnum); //always returns 8-bits

Функция iolpt () всегда возвращает бит, считанный с микроконтроллера, и возвращаемое значение равно 0 или 1.

Является ли моя идея использовать% x приемлемым для 32-битного шестнадцатеричного числа, или я должен попытаться использовать что-то вроде "% lx" вместо "% x", чтобы попытаться представить длинный гекс, даже если это задокументировано нигде или неправильно напечатано функция для 32-битного шестнадцатеричного? Если это неправильная функция, то есть ли функция, которую я могу использовать, которая работает, или я вынужден сначала разбить свой длинный номер на четыре 8-битных числа?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018
printf("Receiving...\n");

iolpt(1); // Tell micro we want to read 32 bits.
    /*  Is this correct?  It looks pretty simple to be
        initiating a read.  It is the same as the calls
        below, iolpt(1), so what makes it different?
        Just because it is first?
    */

unsigned long lnum = 0;
for (unsigned n = 0; n < 32; n++)
{
    unsigned b = iolpt(1); // Read bits one at a time.
    printf("Bit %u of 32 = %u.\n", n, b);
    lnum <<= 1; // Shift bits in our big number left by 1 position.
        // Note this was changed to "lnum <<= 1" from "lnum << 1".
    lnum += b; // And add new value.
}

printf("\n Data returned: %08lx\n", lnum);
    /*  Use:
            0 to request leading zeros (instead of the default spaces).
            8 to request a field width of 8.
            l to specify long.
            x to specify unsigned and hexadecimal.
    */

Исправлено:

  • lnum<<1; до lnum <<= 1;.
  • %x в финале printf до %08lx.
  • %d в printf в цикле до %u, в двух местах.

Также убрано:

  • Удалено b= в исходном b=iolpt(1);, поскольку оно не используется.
  • Перемещено определение b внутри цикла, чтобы ограничить его область.
  • Перемещено определение n в for для ограничения его области действия.
  • Использовал правильную прописную букву и пунктуацию в комментариях для улучшения ясности и эстетики.
0 голосов
/ 29 июня 2018

Будет ли что-то подобное работать для вас?

printf("Receiving...\n");
 unsigned int n=0,b=0;
 unsigned long lnum=0;
 b=iolpt(1); //call to tell micro we want to read 32 bits
 for (n=0;n<32;n++){
     b=iolpt(1); //read bit one at a time
     printf("Bit %d of 32 = %d\n",n,b);
     lnum<<1; //shift bits in our big number left by 1 position
     lnum+=b; //and add new value
 }
 printf("\n Data returned: %#010lx\n",lnum); //now returns 32-bit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...