ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

串口编程 - ascii字符与16进制的相互转换

2021-11-19 21:32:59  阅读:144  来源: 互联网

标签:进制 16 char && 串口 ascii charStr


串口编程 - ascii字符与16进制的相互转换


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

文章目录

前言

计算中所有数据的存储和运算都是使用二进制表示的,这种表示法便于计算机处理,但不便于人类理解。因此便产生了信息编码的概念。

信息编码(Information Coding),即用不同的代码与各种信息中的基本单位组成部分建立一一对应的关系。如计算机中常用的信息编码ASCII码。

串口通信中数据传输也都是使用二进制。为了便于展示或存储,会存在ascii字符与16进制之间的转换,如以ascii方式发送数据,对方以16进制方式进行展示或者以16进制方式发送,对方以ascii方式展示等。

1. 16进制转换为16进制ascii字符

用途:

  • 可用于串口数据接收时,将16进制数据转换为16进制ascii字符
  • 串口调试助手hex显示

示例:0x30 直接展示为 30 两个ascii码

#include <stdio.h>
#include <iostream>

int main()
{
	int recLen = 0;
	char hexChar[3];// two bit hex +  '\0'
	char * receiveStr = NULL;
	receiveStr = new char[1024];

	// mock read
    // recLen = p_sp->readAllData(str);
	receiveStr[0] = 0x00;
	receiveStr[1] = 0x11;
	receiveStr[2] = 0x22;
	receiveStr[3] = 0x33;
	receiveStr[4] = 0x44;
	recLen = 5;

	// convert to hex string
	for (int i = 0; i < recLen; i++)
	{
		snprintf(hexChar, sizeof(hexChar), "%02X", receiveStr[i] & 0xFF);// two bit hex + '\0'
		hexChar[sizeof(hexChar) - 1] = '\0';
		std::cout << hexChar;
	}

	if (receiveStr) 
	{
		delete[] receiveStr;
		receiveStr = NULL;
	}

    return 0;
}

2. ascii字符转换为16进制

用途:

  • 可用于串口发送时,获取ascii字符串对应的16进制数据
  • 串口调试助手hex发送

示例:ascii码0 转换为 0x30

char * HexStrFilter(char *charStr, char *fiterStr)
{
    if (charStr == NULL || fiterStr == NULL)
    {
        return NULL;
    }

    int len = strlen(charStr);

    char *pTemp = fiterStr;

    for(int i = 0; i < len; i++)
    {
        if( ((charStr[i] >= '0') && (charStr[i] <= '9')) ||
            ((charStr[i] >= 'A') && (charStr[i] <= 'F')) ||
            ((charStr[i] >= 'a') && (charStr[i] <= 'f')) )
        {
            *fiterStr++ = charStr[i];
        }
    }

    return pTemp;
}

char CombineHexChar(char charH,char charL) /// CombineHexChar(A,B) result=1011;
{
    char result;

    if(charH >= '0' && charH <= '9')
    {
        result = (charH - '0');
    }
    else if(charH >= 'a' && charH <= 'f')
    {
        result = (charH - 'a'+10);
    }
    else if(charH >= 'A' && charH <= 'F')
    {
        result = (charH - 'A' + 10);
    }
    else
    {
        result = 0;/// need to fiter non-hex character
    }

    result <<= 4;

    if(charL >= '0' && charL <= '9')
    {
        result += (charL - '0');
    }
    else if(charL >= 'a' && charL <= 'f')
    {
        result += (charL - 'a'+10);
    }
    else if(charL >= 'A' && charL <= 'F')
    {
        result += (charL - 'A' + 10);
    }
    else
    {
        result += 0;
    }

    return result;
}

int Char2Hex(char *charStr,char *hexStr)/// character to hex, return value is hexStr length
{
    if (charStr == NULL || hexStr == NULL)
    {
        return 0;
    }

    int hexStrCount = 0;

    char *fiterStr = NULL;
    fiterStr = new char[strlen(charStr) + 1];
    memset(fiterStr,0,strlen(charStr) + 1);

    HexStrFilter(charStr,fiterStr);///filter non-hex character

    int len = strlen(fiterStr);

    // warn: if charStr length not even, the last charactor will lost
    for(int i=0;i < len/2; i++)
    {
        *hexStr++ = CombineHexChar(fiterStr[i*2],fiterStr[i*2+1]);
        hexStrCount++;
    }

    if(fiterStr)
    {
        delete [] fiterStr;
        fiterStr = NULL;
    }

    return hexStrCount;
}

发送

char charStr[] = "0123456789";
 int len = strlen(charStr);
char *hexStr = NULL;
hexStr = new char[len + 1];
memset(hexStr,0,len + 1);

int hexStrLen = 0;
hexStrLen = Char2Hex(charStr,hexStr);

m_serialPort.writeData(hexStr,hexStrLen );

if(hexStr)
{
    delete [] hexStr;
    hexStr = NULL;


License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033


Reference:

  1. https://github.com/itas109/CSerialPort
  2. https://github.com/itas109/CSerialPort/issues/38

标签:进制,16,char,&&,串口,ascii,charStr
来源: https://blog.csdn.net/itas109/article/details/121430355

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有