Побитовые операторы и преобразование интервала к 2 байтам и назад снова

новый пользователь, Привет парни!

Так, надо надеяться, кто-то может помочь.. Мое образование является php, настолько входящим слово низкопроизводительного материала как, символ является байтами, которые являются битами.. который является двоичными значениями.. и т.д. занимает время для приобретения навыка ;)

Что я пытаюсь сделать, здесь отправляется некоторые значения от платы Ardunio до openFrameWorks (оба - C++).

То, что этот сценарий в настоящее время делает (и работает хорошо на один датчик, который я мог бы добавить) при просьбе относительно данных быть отправленным..

int value_01 = analogRead(0);  // which outputs between 0-1024

 unsigned char val1;
 unsigned char val2;

//some Complicated bitshift operation           
    val1 = value_01 &0xFF;
    val2 = (value_01 >> 8) &0xFF;  

    //send both bytes
    Serial.print(val1, BYTE);
    Serial.print(val2, BYTE);

По-видимому, это - самый надежный способ объяснить данные.. Таким образом теперь, когда это, отправляют через последовательный порт, байты добавляются к символьной строке и преобразовали назад..

int num = ( (unsigned char)bytesReadString[1] << 8 | (unsigned char)bytesReadString[0] );

Таким образом для резюме я пытаюсь получить 4 ценности датчиков данных (который я принимаю, будут 8 из тех serialprints?) и иметь интервал num_01 - num_04... в конце всего этого.

Я предполагаю, что это (как с большинством вещей) могло бы быть довольно легко для кого-то с опытом в этих понятиях..

Любая справка значительно ценилась бы.Спасибо

6
задан Roland Illig 13 June 2010 в 09:44
поделиться

4 ответа

Напишите функцию для абстрактной отправки данных (я избавился от ваших временных переменных, потому что они не добавляют большого значения):

void send16(int value)
{
    //send both bytes
    Serial.print(value & 0xFF, BYTE);
    Serial.print((value >> 8) & 0xFF, BYTE);
}

Теперь вы можете легко отправлять любые данные, которые хотите:

send16(analogRead(0));
send16(analogRead(1));
...
7
ответ дан 16 December 2019 в 21:34
поделиться

Просто пошлите их по очереди.

Обратите внимание, что драйвер последовательного порта позволяет отправлять по одному байту (8 бит) за раз. Значение от 0 до 1023 включительно (что похоже на то, что вы получаете) умещается в 10 битах. Так что 1 байта недостаточно. 2 байта, то есть 16 бит, достаточно (есть дополнительное пространство, но если скорость передачи не является проблемой, вам не нужно беспокоиться об этом потраченном впустую пространстве).

Итак, первые два байта могут нести данные для вашего первого датчика. Следующие два байта несут данные для второго датчика, следующие два байта - для третьего датчика и последние два байта - для последнего датчика.

Я предлагаю вам использовать функцию, которую Р. Самуэль Клатчко предложил на передающей стороне, и, надеюсь, вы сможете решить, что вам нужно делать на принимающей стороне.

1
ответ дан 16 December 2019 в 21:34
поделиться
   int num = ( (unsigned char)bytesReadString[1] << 8 | 
               (unsigned char)bytesReadString[0] );

Этот код не будет делать то, что вы ожидаете.

Когда вы сдвигаете 8-битный беззнаковый символ, вы теряете лишние биты.

11111111 << 3 == 11111000

11111111 << 8 == 00000000

т.е. любой беззнаковый символ при сдвиге на 8 бит должен быть равен нулю.

Вам нужно что-то вроде этого:

typedef unsigned uint;
typedef unsigned char uchar;

uint num = (static_cast<uint>(static_cast<uchar>(bytesReadString[1])) << 8 ) |
           static_cast<uint>(static_cast<uchar>(bytesReadString[0]));

Вы можете получить тот же результат, если:

typedef unsigned short ushort;
uint num = *reinterpret_cast<ushort *>(bytesReadString);

Если порядок байтов в порядке. Должен работать на Little Endian (x86 или x64), но не на Big Endian (PPC, Sparc, Alpha и т. Д.)

0
ответ дан 16 December 2019 в 21:34
поделиться

Чтобы немного обобщить код "Send" --

void SendBuff(const void *pBuff, size_t nBytes)
{
    const char *p = reinterpret_cast<const char *>(pBuff);
    for (size_t i=0; i<nBytes; i++)
        Serial.print(p[i], BYTE);
}

template <typename T>
void Send(const T &t)
{
    SendBuff(&t, sizeof(T));
}
0
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

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