3

我正在尝试将两个 8 位数字组合成一个无符号整数,但无论我使用什么类型的转换,结果仍然是有符号数。该代码使用飞思卡尔微处理器 MC9S08LH64 的 CodeWarrior 10.1 编译。

我试过的东西不起作用 - 移动并添加两个 8 位数字,然后在每一步都将它们强制转换为无符号整数。- union/struct 将两个 8 位类型组合起来,并将结果编号转换为 unsigned int。- 使用无符号整数指针(下面的代码)

unsigned int acquire_sensor_voltage_internal_adc()
{ //this is internal ADC
     unsigned int result;
     unsigned int* data_ptr;
     char print_buffer [50];
     int_convert cvt;
    //internal adc collecting counts of input voltage
    //______________________________________________

    //writing to ADCSC1A initiate the conversion sequence
    ADCSC1A= 0x09;
    while(!ADCSC1A_COCOA){}

    cvt.parts.p0 = ADCRHA;
    cvt.parts.p1 = ADCRLA;
    data_ptr = &cvt.int_number;
    result = (unsigned int)*data_ptr;

    sprintf(print_buffer,"here!!!>>>>>>>%d\r\n",result);
    serial_sendString(print_buffer,strlen(print_buffer));
    //_______________________________________________
    return (unsigned int) result;
}

//definition of int_convert from.h file
typedef union{
unsigned int int_number;
struct{
    unsigned char p0;
    unsigned char p1;
}parts;
}int_convert;
4

4 回答 4

3

你可以试试:

result = ((unsigned)ADCRHA) << 8 | (unsigned)ADCRHB;

然后使用正确的格式说明符%u而不是%d.

于 2012-08-16T19:02:58.617 回答
0

如果您想查看无符号的,则必须使用无符号格式来打印该值。%d不是正确的格式。使用%u,你会看到它unsigned

于 2012-08-16T19:06:46.250 回答
0

您正在打印result为有符号整数,因为您%d使用printf. 用于%u指示无符号整数(或者%x如果您想要十六进制打印输出)。

sprintf(print_buffer, "here!!!>>>>>>>%u\r\n", result);

顺便说一句,使用按位运算而不是联合将两个字节转换为单个unsigned int. 这样,您的代码将更易于移植到unsigned超过两个字节的其他编译器。假设Land Hin ADCRLAandADCRHA表示“低”和“高”:

result = (ADCRHA << 8) & ADCRLA;
于 2012-08-16T19:07:50.940 回答
0

你不需要把事情过度复杂化。这适用于任何 HC08:

unsigned int ADC_result = *(unsigned int*) &ADCRHA;

HC08 架构保证对 ADC 的两次读取是同步的,它使用内部硬件缓冲区在读取高位字节后立即保存低位字节。

于 2012-08-17T06:40:38.727 回答