Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как записать биты в массив
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Xenom0rph
на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт, а сделано так, вот хочу переделать но никогда не работал с битами. И не знаю как их правильно туда помещать.
Задача такая на МК пришел поток 0 и 1. Допустим 1010011010101011, сейчас это занимает 16 байт, но ведь как то можно это в 2 байта уложить, вопрос как? Ну и потом это надо вывести по USART на ПК иопять получить 1010011010101011, но уже как 16 байт!
Stanislav_S
Цитата(Xenom0rph @ Jan 30 2009, 20:59) *
на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт, а сделано так, вот хочу переделать но никогда не работал с битами. И не знаю как их правильно туда помещать.
Задача такая на МК пришел поток 0 и 1. Допустим 1010011010101011, сейчас это занимает 16 байт, но ведь как то можно это в 2 байта уложить, вопрос как? Ну и потом это надо вывести по USART на ПК иопять получить 1010011010101011, но уже как 16 байт!

Ну например можно так с помощью битового поля, так упаковывается один байт:
Код
union input_data
{
  unsigned char data;
  struct
  {
    unsigned char in0:1;
    unsigned char in1:1;
    unsigned char in2:1;
    unsigned char in3:1;
    unsigned char in4:1;
    unsigned char in5:1;
    unsigned char in6:1;
    unsigned char in7:1;
  }byte;
};
Xenom0rph
rolleyes.gif а как этим пользоваться?
ARV
и как к этому битовому полю обращаться, чтоб удобно было? это явно не то!

может, вот так лучше:
Код
unsigned char buf[2];

// макросы для работы с битом номер х
#define set_bit(x) (buf[x/8] | (1<<(x % 8))
#define clr_bit(x) (buf[x/8] & ~(1<<(x % 8))
#define get_bit(x) (buf[x/8] & (1<<(x % 8))
когда надо в массив записать 1, используем set_bit(), когда нолик - clr_bit(), а когда надо проверить, что там в массиве, то используем get_bit()
Код
// вывод битов из массива
for(i=0; i<16; i++)
   if(get_bit(i))
      printf("1");
   else
      printf("0");
OLEG_BOS
Цитата(Xenom0rph @ Jan 30 2009, 18:59) *
на МК приходят биты, мне их надо записать в массив, так как их достаточно много, не очень удобно, писать один бит в массив как байт..

"..писать один бит в массив как байт.." не то что "..не очень удобно", а и слишком расходно, особенно для МК biggrin.gif
Понятное дело, что нужно сначала побитно принять данные, потом упаковать в нужный формат числа и лишь потом записывать полученное число в массив.
Вот Вам для примера ( пример для 8- битного АVR)один из вариантов побитного чтения 16-ти битных ( 2 байта ) последовательных данных с порта МК . При необходимости можно без труда переделать с другую произвольную длину..
Код
/*
*****************************************************************************
*                Чтение последовательных 16-ти битных данных  с входа DAT_IN
* Чтение данных происходит по переднему фронту сигнала CLK
*****************************************************************************
*/
#define PIN_DAT_IN              PINB
#define MASK_PIN_DAT_IN    0x10
.......
int ReadData (void)
{
    int data = 0;
    unsigned char temp;

    for (unsigned char i = 0; i < 16; i++)
    {
        Clk_set(0);                        /*   */
        
        temp = PIN_DAT_IN;                    /* Читаем  состояние входов  порта контроллера */
                                    /* По маске выделяем вход с которого читаем данные  */
        if (temp & MASK_PIN_DAT_IN)
        {
            data |= 0x01;                    /* Если на входе  "1" */
        }
        data <<= 1;                        /* Сдвигаем данные для приема следующего бита */                    
        Clk_set(1);                        /*  */
    }

    return(data);
}


Обратное преобразование на компе противоположное упаковке:
В цыкле с последующим сдвигом по маске выделяем бит( начиная со старшего значащего или младшего бита - завистит от того куда делаем сдвиг и по какому биту выставленна маска), который хотим отобразить на экране. Если в нужном бите "1" значит печатаем на экране "1", если "0" - значит печатаем "0" rolleyes.gif
demiurg_spb
Цитата(ARV @ Jan 30 2009, 21:08) *
и как к этому битовому полю обращаться, чтоб удобно было? это явно не то!
А в чём проблема? В структуре есть поля битовые или нет - это без разницы. Обращаться напрямую очень просто и очень удобно.
Код
struct_name.field_name1 = 1;
struct_name.field_name2 = 0;
Единственное ограничение - нельзя сделать массив из бит.
Поэтому работать в цикле с битовыми полями действительно невозможно.
Для упаковки бит в байты хороший вариант OLEG_BOS продемонстрировал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.