将char变量转换为unsigned int

时间:2012-10-02 10:51:58

标签: c embedded avr

我正在尝试将char变量转换为Unsigned int。我的代码是

char spi(char data) 
{ 
    //Start transmision 
    SPDR = data; 
    //Wait for transmision complete 
    while(!(SPSR & 0x80)); 
    return SPDR; 
} 

unsigned int ReadAd(void) 
{ 
    unsigned int data; 

    ChipSelectAd(1); 
    //Read data 
    CheckStatus();                                            
    spi(0x58);                                                
    data = (spi(0xFF)<< 8);    
    data |= spi(0xFF);         

    return data; 
} 

实际上我的问题是spi函数返回一个8位字符,所以上面的代码将char变量左移8位然后将它分配给一个16位变量,结果将始终为0。 为了实际将数据移到左边,我需要首先将它们类型化为16位类型变量。我试过这样的

char spi(char data) 
{ 
    //Start transmision 
    SPDR = data; 
    //Wait for transmision complete 
    while(!(SPSR & 0x80)); 
    return SPDR; 
} 

unsigned int ReadAd(void) 
{ 
    unsigned int data; 

    ChipSelectAd(1); 
    //Read data 
    CheckStatus();                                            
    spi(0x58);                                                
    data = (unsigned int)((unsigned char)spi(0xFF)<< 8);    
    data |= (unsigned int)((unsigned char)spi(0xFF));         

    return data; 
} 

void CheckStatus(void)
{
//char adcStatus;
adcStatus = 0xFF;                                           
//Read status
while(!(adcStatus & 0x80))
{
    spi(0x40);
    adcStatus = spi(0xFF);
 }
}

void ChipSelectAd(char s)
{


if(s == 1){
    PORTB.3 = 0;    //Switch on ADC
    //while(PINB.3);  //Wait for chip select pin
}
    else
        PORTB.3 = 1;    //Switch off ADC
 }

它不起作用。请告诉我我必须使用哪种功能。

提前致谢。

2 个答案:

答案 0 :(得分:5)

你的问题不是演员表。由于整体推广规则,没有它们的情况也是如此。

#include <stdio.h>

char spi ( char data )
{
  char SPDR = data;
  return SPDR;
}

unsigned int ReadAd ( void )
{
  unsigned int data;

  data = spi ( 0x81 ) << 8;
  data |= spi ( 0x42 );

  return data;
}

int main ( void )
{
  printf ( "Result %x\n", ReadAd() );
  return 0;
}

在char为签名类型的系统上输出Result ffff8142。要解决实际问题,请尝试确定spi()调用变量的值,然后打印它们的值。另请告诉我们SPDR的声明/定义。

答案 1 :(得分:1)

1)在嵌入式系统中:摆脱标准的整数类型,特别是默认的char类型。如果您有一个现代编译器,请使用stdint.h中的uint8_t,uint16_t等。如果您有一个古老的编译器,那么typedef unsigned char uint8_t等等。如果你没有在嵌入式系统中使用已知大小的无符号类型,那么你就是在寻找bug错误。

2)学习并理解integer promotion rules。令人恐惧的是,有多少程序员不了解或理解它们。

一旦你完成了上面两个基础知识,你的代码应该看起来像这样的代码:

(我冒昧地修复了各种可疑的,可能的错误以及蹩脚,不一致的缩进。加上一些风格的挑剔。)

#include <stdint.h>

uint8_t spi (uint8_t data) 
{ 
  SPDR = data; //Start transmision 

  while((SPSR & 0x80) > 0) //Wait for transmision complete 
    ; 

  return SPDR; 
} 

uint16_t ReadAd(void) 
{ 
  uint16_t data; 

  ChipSelectAd(true); 

  CheckStatus(); //Read data 
  (void) spi(0x58);                                                

  data  = ((uint16_t)spi(0xFF)) << 8;
  data |=  (uint16_t)spi(0xFF);

  return data; 
} 

void CheckStatus(void)
{
  uint8_t adcStatus;

  do
  {
    (void) spi(0x40);
    adcStatus = spi(0xFF);
  } while((adcStatus & 0x80) > 0);
}

void ChipSelectAd(bool on)
{
  if(on)
  {
    PORTB.3 = 0;    //Switch on ADC
  }
  else
  {
    PORTB.3 = 1;    //Switch off ADC
  }
}