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')为例:
asciiHexToNibble('B')返回11(0xB),左移4位后为0xB0asciiHexToNibble('8')返回8(0x08)- 按位或运算后得到
0xB0 | 0x08 = 0xB8,与预期结果一致。
内容的提问来源于stack exchange,提问作者Hyunwoo Choi
相关产品推荐
相关产品推荐

