串口接收到的十六进制数如何转换为十进制

在串口通信里,接收到的十六进制数据往往要转换为十进制数,这样才能更方便地进行处理或显示。下面为你详细介绍转换方法和代码实现:

转换原理

  1. 十六进制表示:串口接收到的数据一般是字节流,在编程时会以字符串(像 "0x1A" 或者 "1A" 这样的形式)或者整数(例如 0x1A)来呈现。
  2. 转换逻辑: 字符串形式:直接使用编程语言提供的内置函数进行转换。整数形式:由于计算机内部本身就以二进制(和十六进制等价)来存储整数,所以无需进行额外转换,直接使用即可。

代码示例

下面通过不同编程语言来实现十六进制到十进制的转换:

# 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

全部评论

相关推荐

在看牛客的社畜很积极:身高体重那一行信息去掉,学校那一行的信息放上面,找半天都没找到你是哪个学校什么专业的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务