[原创]单片机-HexToStr or HexToAsc

最近用单片机做个案子

其中想着把内存中的数据发到电脑的串口调试软件上来,看看数据对不对

比如单片机中的一个数据

    uint8_t  / Byte / Char  单字节

    uint16_t  / intger  双字节

    uint32   4字节

我想把它 通过串口 发送到串口调试软件上来

于是写下了  下面的转换函数

 1 uint8_t uInt_HexToStr(void * pDest,void * pSrc,uint8_t Bytes_Of_Src)
 2 {
 3     uint8_t aHex[4];
 4     uint8_t Tmp;
 5     uint8_t *pDest2;
 6     uint8_t *pSrc2; 
 7     
 8     if ((Bytes_Of_Src==1) || (Bytes_Of_Src==2) ||(Bytes_Of_Src==4))
 9     {    
10         pDest2 = pDest;    
11         pSrc2  = pSrc;
12         
13         if (Bytes_Of_Src==1)
14         {
15             aHex[0] = *pSrc2;  
16         }
17         
18         if (Bytes_Of_Src==2)
19         {
20             aHex[0] = *(pSrc2+1);
21             aHex[1] = *pSrc2;  
22         }
23         
24         if (Bytes_Of_Src==4)
25         { 
26             aHex[0] = *(pSrc2+3);
27             aHex[1] = *(pSrc2+2);        
28             aHex[2] = *(pSrc2+1);
29             aHex[3] = *pSrc2;       
30         }
31         
32         Tmp = (aHex[0]&0xf0)>>4;
33         (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);           
34         *pDest2=Tmp;
35                      
36         Tmp = (aHex[0]&0x0f);
37         (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);     
38 
39         *(pDest2+1)=Tmp;
40         
41         
42         if (Bytes_Of_Src>=2)
43         {
44             Tmp = (aHex[1]&0xf0)>>4;
45             (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);           
46             *(pDest2+2)=Tmp;
47                          
48             Tmp = (aHex[1]&0x0f);
49             (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);     
50             *(pDest2+3)=Tmp;
51         }
52         //----------------------------------------------
53         if (Bytes_Of_Src>=4)
54         {
55             Tmp = (aHex[2]&0xf0)>>4;
56             (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);           
57             *(pDest2+4)=Tmp;
58                          
59             Tmp = (aHex[2]&0x0f);
60             (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);     
61 
62             *(pDest2+5)=Tmp;
63             
64             Tmp = (aHex[3]&0xf0)>>4;
65             (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);           
66             *(pDest2+6)=Tmp;
67                          
68             Tmp = (aHex[3]&0x0f);
69             (Tmp<10) ? (Tmp=Tmp+0x30) : (Tmp=Tmp+0x37);     
70             *(pDest2+7)=Tmp;  
71         } 
72         
73         Tmp=1; // 执行完毕     
74     }
75     else
76     {
77         Tmp=0; // 源数据字节长度不符合要求,只能是2或者4 字节
78     }
79     
80     return Tmp; //返回执行结果:1-正常,0-异常
81     
82 }

以上代码 可以转换单字节   双字节   4字节 ,这个里面还要注意  数据大小端的问题,大家要特别注意一下,不同的单片机或者编译器 都有可能会有 双字节或者 4字节 大小端问题 

uint8_t Bytes_Of_Src 可以赋值 1 / 2 / 4 代表不同的源数据字节数

下面是调用函数的例子

void uUSART_Test(void)
{
    
    /* 局部变量定义 */

    char src[50], dest[50];
    
    uint32_t aaa=0x1234ABCD;  //举例要把这个数据发到电脑上查看

    uInt_HexToStr(dest,&aaa,4); // 要转换的数据是4个字节的,转换结果放在dest里面
    
    uUART_PutStr_Len(USART1,(uint8_t * )dest,8);  //发送到电脑上的调试窗口 显示 1234ABCD

    uUART_PutStr(USART1,"
");

    

}

显示结果

谢谢大家    留言评论

原文地址:https://www.cnblogs.com/caohenry999/p/12583728.html