ZHCADY9 April   2024 LM73 , LM75B , LM95071 , TMP100 , TMP101 , TMP102 , TMP103 , TMP104 , TMP107 , TMP1075 , TMP108 , TMP112 , TMP114 , TMP116 , TMP117 , TMP121 , TMP122 , TMP123 , TMP124 , TMP126 , TMP144 , TMP175 , TMP1826 , TMP1827 , TMP275 , TMP400 , TMP401 , TMP411 , TMP421 , TMP422 , TMP423 , TMP431 , TMP432 , TMP435 , TMP451 , TMP461 , TMP464 , TMP468 , TMP4718 , TMP75 , TMP75B , TMP75C

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 二进制补码
      1. 1.1.1 二进制补码特征
    2. 1.2 Q 格式
    3. 1.3 常见温度数据格式
    4. 1.4 高精度温度数据格式
  5. 2代码示例
    1. 2.1  16 位(采用 Q7 表示法)
      1. 2.1.1 属性
      2. 2.1.2 C 代码
    2. 2.2  12 位(采用 Q4 表示法)
      1. 2.2.1 属性
      2. 2.2.2 C 代码
    3. 2.3  13 位(采用 Q4 表示法)(EM=1)
      1. 2.3.1 属性
      2. 2.3.2 C 代码
    4. 2.4  13 位(采用 Q4 表示法)
      1. 2.4.1 属性
      2. 2.4.2 C 代码
    5. 2.5  14 位(采用 Q6 表示法)
      1. 2.5.1 属性
      2. 2.5.2 C 代码
    6. 2.6  TMP182x 格式
      1. 2.6.1 属性
      2. 2.6.2 C 代码
    7. 2.7  14 位(采用 Q5 表示法)
      1. 2.7.1 属性
      2. 2.7.2 C 代码
    8. 2.8  8 位(无 Q 表示法)
      1. 2.8.1 属性
      2. 2.8.2 C 代码
    9. 2.9  11 位(采用 Q3 表示法)
      1. 2.9.1 属性
      2. 2.9.2 C 代码
    10. 2.10 不采用二进制补码的器件
      1. 2.10.1 属性
      2. 2.10.2 C 代码
  6. 3其他编程语言
    1. 3.1 解析
    2. 3.2 二进制补码
    3. 3.3 丢弃未使用的位
    4. 3.4 应用 Q 格式
  7. 4总结
  8. 5参考资料
  9. 6附录:Q 应用源代码
  10. 7附录:器件概要表

解析

  • 对硬件进行编程时,数据通常作为两个 8 位字节返回。
    • 如果编程语言支持显式类型转换,则最好一开始将这些字节存储为无符号字节,以便更好地控制转换为有符号字节的过程。必须避免的行为是对低位字节进行符号扩展
/* C Signed Types */
unsigned char x = 0xFF;
signed char y = 0xFF;
/* x is treated as 255 and y as -1 */

/* C99 fixed width integer types */
uint8_t x = 0xFF;
int8_t y = 0xFF;
/* x is treated as 255 and y as -1 */
  • 在 C 语言中,sscanf() 用于解析字符串 (char*),其中包括带有 0x 前缀的数字。与之对应的 printf() 使用相同的格式字符串。长度修饰符是格式字符串一个不太常用的特性,但此修饰符可以帮助清理小数据类型。下表列出了各种数据类型和格式字符串以及相关的长度修饰符。请注意,scanf 中使用的 %i 可以检测并正确解码 0x 前缀,而 %d 和其他格式说明符则不能。
表 3-1 带有长度修饰符的 C 格式字符串
数据类型 固定宽度类型 格式字符串
8 char int8_t/uint8_t %hhi
16 short int int16_t/uint16_t %hi
32 int int32_t/uint32_t %i
/* C Parsing and Outputting Hex */
char *s = "0xFF";
uint8_t x;
sscanf(s, "%hhi", &x);
/* x is 255 */

/* printf without length modifier */
printf("%i, %d, %u, %x\n", x, x, x, x);
/* "-1, -1, 4294967295, ffffffff" is printed due to coercion into 32 bit types and sign-extend */

/* printf with length modifier */

printf("%hhu, 0x%hhX, %#hhX\n", x, x, x);
/* the desired "255, 0xFF, 0XFF" is printed */
  • 十六进制使用非常方便。Excel 具有 HEX2DEC 及相关函数。此函数不支持在前面加上“0x”。HEX2DEC 会将“FFFFFFFFFF”(十个 F)转换为 -1,因此该函数在内部相当于一个 40 位有符号数据类型。这个位数对于存储温度数据来说已经足够了。
  • Excel 中的二进制函数(比如 DEC2BIN)只能处理 9 位二进制数据。
  • HEX2DEC 是解码温度数据所需的,而互补函数 DEC2HEX 则在编码温度数据时很有用。
  • 在下表中,B 列计算的结果为 15 和 0xA。
表 3-2 用于解析的 Excel 示例
A B
1 F =HEX2DEC(A1)
2 10 =DEC2HEX(A2)
  • JavaScript、Python 和 C 都接受带有 0x 前缀的数字常数。
  • JavaScript 中的函数 parseInt() 用于解析十六进制的“0x”表示法。例如,parseInt() 函数可以正确地“0xA”转换为 10。
  • JavaScript 中的 toString() 方法用于将数据转换为字符串,如果提供参数 16,则会创建一个十六进制值。
/* JavaScript Parsing and Outputting Hex */
let x = 0xA
let y = parseInt("0xA")
let z = (10).toString(16)
let s = "0x" + x.toString(16).toUpperCase().padStart(2,'0')
/* x and y are 10, z is 'a' and s is '0x0A' */
  • Python 的 int() 可以在提供基数参数的情况下转换字符串。
  • Python 的 hex() 可以将数字转换为十六进制字符串。
# Python Parsing and Outputting Hex
x = 0xA
y = int("A",base=16)
z = hex(10)
# x and y are 10, z is '0xa'