во встроенном C, как преобразовать возвращаемое шестнадцатеричное значение в виде "беззнакового символа" в пригодный для использования тип "целое число" - PullRequest
0 голосов
/ 31 марта 2011

Мы пишем код для интерфейса I2C, где мы читаем 16-битное шестнадцатеричное число как два 8-битных шестнадцатеричных MSB и LSB, и мы возвращаем эти значения как «беззнаковый символ».

мы хотимчтобы объединить эти значения MSB и LSB "char" , и, наконец, нам понадобится одно "Integer" значение для нашей дальнейшей обработки. Например,

: следующие 2 методавозвращают одно значение "Неподписанный символ" , каждое

1)

unsigned char i2c_readAck(void)
{
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
    while(!(TWCR & (1<<TWINT)));

    return TWDR;

}/* i2c_readAck */

2)

unsigned char i2c_readNak(void)
{
    TWCR = (1<<TWINT) | (1<<TWEN);
    while(!(TWCR & (1<<TWINT)));

    return TWDR;

}/* i2c_readNak */

мы должны получить MSB иЗначения LSB из этих двух методов, которые являются фактическими необходимыми значениями HEX, но в беззнаковом типе char объедините его, и, наконец, объединенное значение должно быть преобразовано в пригодный для использования формат Integer,

мы находим часть разговора оченьхитро, кто-нибудь может нам помочь ??

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

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

unsigned char msb = ...; // read MSB
unsigned char lsb = ...; // read LSB
int val = (msb << 8) | lsb; // combine MSB and LSB to make an int
0 голосов
/ 31 марта 2011

Да, это сложно и сложно визуализировать.Помните, что MSB и LSB, которые вы получаете (вероятно), являются фактическими двоичными представлениями, которые вам нужны;вам не нужно конвертировать эти вещи.Вот как работает i2c.Итак:

  int number = 0, msb, lsb;

  msb = 0xff & read_one_unsigned_i2c_byte();
  lsb = 0xff & read_one_unsigned_i2c_byte();

  number = msb << 8;      // gotta' shift msb to upper 8 bits of final result
  number = number | lsb;  // and then IOR in the lower 8 bits

- Пит

...