历史上的今天
返回首页

历史上的今天

今天是:2025年07月27日(星期日)

正在发生

2019年07月27日 | stm32串口发送16进制字符和16进制数的区别和具体实现方法

2019-07-27 来源:eefocus

在调试一个stm32串口通信时,下位机设置好的发送方式采用串口助手接收后已经可以正常离线解包。但是由于需要实时解包并存储,因此写了一个实时解包存储的上位机,通信正常后接收的数据一直有误。经过单步调试,发现单片机发送的数据帧是字符串,并不是16进制数,而在线解包程序直接是对16进制数进行处理的,这就导致的比如16进制的数0xAA(170),下位机发送的是“AA"(字符串),上位机处理的16进制数是41 41(10进制为65*100+65)。查询‘A’的ASCII码可知,‘A’的ASCII码对应的10进制数为65,16进制数为41,也就是说上位机把接收到的16进制字符串当16进制数处理了,所以出错。


解决方法两个,一个是修改下位机发送方式,将其改为发送“16进制数”,而不是“16进制字符串“;另一个是修改上位机接收方式,收到后将”16进制字符串“先转换为”16进制数“。多次尝试后发现还是修改下位机发送方式较为简单,且比较实用,因为大部分下位机串口发送协议发送的是16进制数。


关于发送”16进制数“和”16进制字符“这两种数据发送方式原理的不同之处可见这篇文章http://blog.csdn.net/yibu_refresh/article/details/22695063。


下面是在stm32中进行两种数据发送的具体方法:


一、发送16进制字符

例如我们要发送一个32位的数:uint32_t  temp_send;

发送方式如下,将32位的16进制数转换为8个对应的字符分别输出,例如:0xF0123456,将发送“F0123456”字符串:


uint32_t  temp_send;

//主函数

int main(void)

{

  while(1)

  {

   UART4_Putc_Hex(0xAA);//帧头

   UART4_Putdw_Hex(temp_send);

  }

}

//子函数

/**************************实现函数********************************************

*函数原型:  void UART4_Putdw_Hex(uint32_t dw)

*功  能:  RS232以十六进制ASCII码的方式发送32位的数据.

    如:0xF0123456 将发送 " F0123456 "

*输入参数:uint32_t dw   要发送的32位数据值

*输出参数:没有 

*******************************************************************************/

void UART4_Putdw_Hex(uint32_t dw)

{

    UART4_Putw_Hex((uint16_t) (dw >> 16));

    UART4_Putw_Hex((uint16_t) (dw & 0xffff));

}

/**************************实现函数********************************************

*函数原型:  void UART4_Putw_Hex(uint16_t w)

*功  能:  RS232以十六进制ASCII码的方式发送一个字的数据.就是发送一个int

    如:0x3456 将发送 " 3456 "

*输入参数:uint16_t w   要发送的字

*输出参数:没有 

*******************************************************************************/

void UART4_Putw_Hex(uint16_t w)

{

 //发送高八位数据,当成一个字节发送

    UART4_Putc_Hex((uint8_t) (w >> 8));

 //发送低八位数据,当成一个字节发送

    UART4_Putc_Hex((uint8_t) (w & 0xff));

}

/**************************实现函数********************************************

*函数原型:  void UART4_Putc_Hex(uint8_t b)

*功  能:  RS232以十六进制ASCII码的方式发送一个字节数据

       先将目标字节数据高4位转成ASCCII ,发送,再将低4位转成ASCII发送

      如:0xF2 将发送 " F2 "

*输入参数:  uint8_t b   要发送的字节

*输出参数:  没有 

*******************************************************************************/

void UART4_Putc_Hex(uint8_t b)

{

      /* 判断目标字节的高4位是否小于10 */

    if((b >> 4) < 0x0a)

        UART4_Put_Char((b >> 4) + '0'); //小于10  ,则相应发送0-9的ASCII

    else

        UART4_Put_Char((b >> 4) - 0x0a + 'A'); //大于等于10 则相应发送 A-F

 

    /* 判断目标字节的低4位 是否小于10*/

    if((b & 0x0f) < 0x0a)

        UART4_Put_Char((b & 0x0f) + '0');//小于10  ,则相应发送0-9的ASCII

    else

        UART4_Put_Char((b & 0x0f) - 0x0a + 'A');//大于等于10 则相应发送 A-F

//   UART4_Put_Char(' '); //发送一个空格,以区分开两个字节

}

/**************************实现函数********************************************

*函数原型: void UART4_Put_Char(unsigned char DataToSend)

*功  能: RS232发送一个字节

*输入参数:unsigned char DataToSend   要发送的字节数据

*输出参数:没有

*******************************************************************************/

void UART4_Put_Char(unsigned char DataToSend)

{

  TxBuffer[count++] = DataToSend;  

  USART_ITConfig(UART4, USART_IT_TXE, ENABLE);  

}

二、发送16进制数

发送方式如下,需要先将32位的数移位分割为4个字节(1个字节8位)的8位数分别发送,例如:0xF0123456,将发送F0 12 34 56(4个16进制数):


uint32_t  temp_send;

char ByteSend[5]={0};//发送的字节

uint i;

//主函数

int main(void)

{

  while(1)

  {

ByteSend[0] = 0xAA;//帧头,ByteSend的类型为uchar或char均可

ByteSend[1] = (temp_send>>24) & 0xFF;//

ByteSend[2] = (temp_send>>16) & 0xFF;

ByteSend[3] = (temp_send>>8) & 0xFF;

ByteSend[4] = temp_send & 0xFF;

for(i=0;i<5;i++)

    { 

      UART4_Put_Char(ByteSend[i]);

  }

  }

 

}

//子函数

/**************************实现函数********************************************

*函数原型:  void UART4_Put_Char(unsigned char DataToSend)

*功  能:  RS232发送一个字节

输入参数:

  unsigned char DataToSend   要发送的字节数据

输出参数:没有 

*******************************************************************************/

void UART4_Put_Char(unsigned char DataToSend)

{

  TxBuffer[count++] = DataToSend;  

  USART_ITConfig(UART4, USART_IT_TXE, ENABLE);  

}


推荐阅读

史海拾趣

GE (General Electric)公司的发展小趣事
检查各电机是否正常运转,有无异响或过热现象。
Cicoil公司的发展小趣事

Cicoil公司的创立可以追溯到电子行业的快速发展时期。创始人看到了扁平电缆在电子设备中的巨大潜力,于是决定专注于这一领域的研究和开发。他们投入大量资源,研发出具有独特技术的柔性扁平电缆,为电子设备提供了更为灵活和可靠的连接方案。这一创新产品在市场上引起了轰动,为Cicoil公司赢得了良好的声誉和市场份额。

Ferranti Electric Inc公司的发展小趣事

作为一家具有社会责任感的企业,Ferranti Electric Inc公司一直致力于可持续发展。公司注重环保和节能,采用环保材料和生产工艺,减少对环境的影响。同时,公司也积极参与公益事业和社会活动,回馈社会。这些举措不仅体现了公司的社会责任感,也为公司的长远发展奠定了坚实的基础。

Aimtec公司的发展小趣事

Aimtec公司自成立以来,一直致力于电子转换技术的研发与创新。在某个关键时期,公司研发团队成功开发出一种新型的DC-DC转换器,其转换效率较市场同类产品提高了近20%。这一技术突破迅速得到了业界的关注,不仅帮助Aimtec在市场上取得了竞争优势,也为客户的产品带来了更高的性能。随着该技术的普及应用,Aimtec的品牌知名度逐渐提升,公司在电子行业中崭露头角。

Chiplus Semiconductor Corp公司的发展小趣事

Chiplus深知企业管理对于公司发展的重要性。因此,公司建立了一套完善的管理体系,注重人才培养和团队建设。公司定期举办内部培训和技术交流活动,提升员工的专业技能和综合素质。同时,Chiplus还积极引进外部优秀人才,为公司的持续发展注入新的活力。

GSG公司的发展小趣事
具备自动校准、自动补偿、自动报警等智能化功能,降低了人工干预的需求。

问答坊 | AI 解惑

手机测试资料

CTA测试项目解释,大家分享一下啦 …

查看全部问答>

软件GPS及其应用

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 软件GPS能降低GPS实施的成本和减少GPS的占用空间,是GPS的应用的终极目标,特别是在手机等对成本和空间要求严格的电子产品市场. 芬兰Fastrax软GPS方案,对主CPU占用的资源非常小.在采用纯软件GPS ...…

查看全部问答>

分享一下毕业论文

本文主要研究的课题是深圳市普禄科智能检测设备有限公司的研制项目——无线数据采集分析系统,该系统主要应用在机车检测方面。系统具备低功耗、抗干扰能力强、大容量、实时采集、数据传输安全可靠等特点。文中提出设计思路:主机通过无线传输模 ...…

查看全部问答>

最简传感器电路

最简传感器电路需要插到PC的串口使用,利用计算机的强大功能进行各种应用, 其接口电路各有所长,偶以分立件组成的RS232电路最简   其电路如下:    …

查看全部问答>

有关激光的接受的问题,请赐教~~~

我们现在在做循线小车,需要用到激光传感器来判断黑线的位置。发射管用得是红色激光。 1. 不过接收管就不知道用什么了。 网上看到很多接收管的功率都很大,我们的电源只有7.2V的电池,而且还要用8个接收管,不知道有没有小功率的接收管呢?最好 ...…

查看全部问答>

寻求做过机床控制软件的人一起合作

寻求做过机床控制软件的人一起合作,兼职也可以!要求做个机床控制软件,特别是激光切割机器类软件的```` 有意者联系QQ:183273519 或者hefei_cn@163.com   2010.6.20…

查看全部问答>

请教定时器的问题,谢谢

请问这里为什么要除256,取模,谢谢大家 TH0=(65536-46080)/256; TL0=(65536-46080)%256; //定义定时器初值 以下是全部代码 #include #define uchar unsigned char uchar count; //全局变量 void time0() interrupt 1 using 0 //定时器0 { ...…

查看全部问答>

有问题想请教一下各位老大,是关于工控方面的-------NPM(PCD4521)

我正在做有关工业控制的项目,但我是一个新人,那个项目要用到PCD4521,可是我还不会用那个IC,所以想问一下有谁可以帮忙的,谢谢大家!…

查看全部问答>

SofTecFlashRunnerproductionprogrammerforSTR7andST7

http://mcu.st.com/mcu/modules.php?name=Content&pa=showpage&pid=97我们很高兴地告诉您,浦洛电子正在热销一款来自SofTec Microsystems的新一代ISP万用量产型烧录器---FlashRunner.该款产品除了延续Softec一惯推崇的高速、稳定、灵活等 ...…

查看全部问答>