You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino开发:将RS485接收的2字节ASCII转换为1字节十六进制

Arduino RS485 ASCII十六进制转字节解决方案

你的现有代码仅能正确处理数字类ASCII十六进制字符('0'-'9'),遇到字母类('A'-'F')时计算逻辑错误——比如ASCII 'B'(0x42)减去0x30得到0x12,而非对应的十六进制数值0xB(11)。

解决代码

首先实现一个辅助函数,将单个ASCII十六进制字符转换为对应的4位数值:

uint8_t asciiHexToNibble(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';
    } else if (c >= 'A' && c <= 'F') {
        return 10 + (c - 'A');
    } else if (c >= 'a' && c <= 'f') {
        return 10 + (c - 'a');
    }
    // 无效字符返回错误值,可根据需求调整
    return 0xFF;
}

再用这个函数处理接收的ASCII字符,合并为1字节十六进制值:

uint8_t DATA1 = (asciiHexToNibble(MFC_Respons[7]) << 4) | asciiHexToNibble(MFC_Respons[8]);
uint8_t DATA2 = (asciiHexToNibble(MFC_Respons[9]) << 4) | asciiHexToNibble(MFC_Respons[10]);
uint8_t DATA3 = (asciiHexToNibble(MFC_Respons[11]) << 4) | asciiHexToNibble(MFC_Respons[12]);
uint8_t DATA4 = (asciiHexToNibble(MFC_Respons[13]) << 4) | asciiHexToNibble(MFC_Respons[14]);

逻辑说明

  • 辅助函数asciiHexToNibble会根据字符类型返回对应数值:
    • 数字字符直接转为0-9的整数
    • 大写/小写字母A-F转为10-15的整数(对应十六进制的A-F)
  • 合并时,将高4位数值左移4位(等价于乘以16),再与低4位数值做按位或运算,得到完整的1字节十六进制值。

验证示例

以你的示例输入0x42, 0x38(ASCII 'B','8')为例:

  1. asciiHexToNibble('B')返回11(0xB),左移4位后为0xB0
  2. asciiHexToNibble('8')返回8(0x08)
  3. 按位或运算后得到0xB0 | 0x08 = 0xB8,与预期结果一致。

内容的提问来源于stack exchange,提问作者Hyunwoo Choi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:37:56