串口接收到的十六进制数如何转换为十进制
在串口通信里,接收到的十六进制数据往往要转换为十进制数,这样才能更方便地进行处理或显示。下面为你详细介绍转换方法和代码实现:
转换原理
- 十六进制表示:串口接收到的数据一般是字节流,在编程时会以字符串(像
"0x1A"或者"1A"这样的形式)或者整数(例如0x1A)来呈现。 - 转换逻辑: 字符串形式:直接使用编程语言提供的内置函数进行转换。整数形式:由于计算机内部本身就以二进制(和十六进制等价)来存储整数,所以无需进行额外转换,直接使用即可。
代码示例
下面通过不同编程语言来实现十六进制到十进制的转换:
# Python示例
# 情况1:从串口接收到的是字符串格式
hex_str = "0x1A" # 或者直接是 "1A"
decimal1 = int(hex_str, 16) # 转换为十进制整数
print(f"字符串 '0x1A' 转换为十进制: {decimal1}") # 输出:26
hex_str = "1A"
decimal2 = int(hex_str, 16) # 转换为十进制整数
print(f"字符串 '1A' 转换为十进制: {decimal2}") # 输出:26
# 情况2:从串口接收到的是字节数据(bytes类型)
hex_bytes = b'\x1A' # 表示一个字节,值为0x1A
decimal3 = int.from_bytes(hex_bytes, 'big') # 转换为十进制整数
print(f"字节 b'\\x1A' 转换为十进制: {decimal3}") # 输出:26
// Java示例
public class Main {
public static void main(String[] args) {
// 情况1:从串口接收到的是字符串格式
String hexStr = "0x1A";
int decimal1 = Integer.parseInt(hexStr.replace("0x", ""), 16);
System.out.println("字符串 '0x1A' 转换为十进制: " + decimal1); // 输出:26
// 情况2:从串口接收到的是字节数据
byte hexByte = 0x1A; // 注意:Java中的byte是有符号的
int decimal2 = hexByte & 0xFF; // 转换为无符号整数
System.out.println("字节 0x1A 转换为十进制: " + decimal2); // 输出:26
}
}
// C语言示例
#include <stdio.h>
#include <stdlib.h>
int main() {
// 情况1:从串口接收到的是字符串格式
char hex_str[] = "0x1A";
int decimal1;
sscanf(hex_str, "%x", &decimal1); // 转换为十进制整数
printf("字符串 '0x1A' 转换为十进制: %d\n", decimal1); // 输出:26
// 情况2:从串口接收到的是字节数据
unsigned char hex_byte = 0x1A;
int decimal2 = (int)hex_byte; // 直接转换为整数
printf("字节 0x1A 转换为十进制: %d\n", decimal2); // 输出:26
return 0;
}
代码解释
- 字符串转换: Python:使用 int(hex_str, 16) 函数,其中 16 代表进制。Java:先使用 replace("0x", "") 去掉前缀,再用 Integer.parseInt() 函数进行转换。C语言:借助 sscanf() 函数和 %x 格式说明符来实现转换。
- 字节转换: Python:使用 int.from_bytes() 函数,并指定字节序(如 'big')。Java:由于Java的 byte 是有符号的,所以要通过 & 0xFF 转换为无符号整数。C语言:直接将 unsigned char 类型转换为 int 类型即可。
注意事项
- 前缀处理:如果字符串包含
"0x"前缀,在转换前要先将其去除。 - 有符号/无符号:对于字节数据,要留意其是有符号还是无符号类型,防止出现符号扩展的问题(就像Java示例中那样)。
- 多字节数据:要是接收到的是多个字节(例如16位整数
0x1234),需要先将字节组合起来,然后再进行转换。
掌握这些方法后,你就能轻松处理串口通信中的十六进制数据了。
更多内容全在下方专栏
全网最受欢迎的嵌入式笔试专栏
笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学
3000+订阅还会涨价,提前订阅提前享受,持续更新中。
专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
查看7道真题和解析