我正在尝试将两个8位数组合成一个unsigned int,但无论我使用什么类型的转换,结果仍然是有符号数。使用CodeWarrior 10.1为飞思卡尔微处理器MC9S08LH64编译代码。
我试过的东西没用 - 移位并添加两个8位数,然后在每一步都将它们转换为unsigned int。 - union / struct将两个8位类型组合在一起,将结果数组合为unsigned int。 - 使用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;
答案 0 :(得分:3)
你可以尝试:
result = ((unsigned)ADCRHA) << 8 | (unsigned)ADCRHB;
然后使用正确的格式说明符%u
而不是%d
。
答案 1 :(得分:0)
如果要查看未签名的,则必须使用无符号格式来打印该值。 %d
不是正确的格式。使用%u
,您会将其视为unsigned
。
答案 2 :(得分:0)
您正在将result
打印为有符号整数,因为您使用%d
格式printf
。使用%u
表示无符号整数(如果需要十六进制打印输出,则使用%x
。)
sprintf(print_buffer, "here!!!>>>>>>>%u\r\n", result);
顺便说一句,使用按位运算而不是联合来将两个字节转换为单个unsigned int
可能是个好主意。这样,您的代码将更容易移植到unsigned
超过两个字节的其他编译器。假设L
和H
中的ADCRLA
和ADCRHA
表示“低”和“高”:
result = (ADCRHA << 8) & ADCRLA;
答案 3 :(得分:0)
你不需要过于复杂的事情。这适用于任何HC08:
unsigned int ADC_result = *(unsigned int*) &ADCRHA;
HC08架构保证对ADC的两次读取同步,一旦读取到较高值,它就会使用内部硬件缓冲区来保存低字节。