当前位置:   article > 正文

Zigbee、STM32单片机串口收发必会数据传输-uint8、uint16等数据的解析-串口传输多数据与解析-物联网_stm32的uint8_t

stm32的uint8_t

一、概述

        在常见的串口数据传输中,我们所熟知单片机常常传递的是unsigned char的数组,也有部分类库会定义成uint8、uint8_t的类型,但其本质上仍是char类型。

        而我们常见的串口通信一般分为两种格式,分别为ASCII与HEX传输,这也决定着数据接收方解析方式的不同。

        在某些情况下,我们需要用串口发送一些特殊的文本,其中不乏包含数据、格式等信息,我们需要正确了解其数据对应unsigned char的格式,就可以做到对数据的解析。

二、基础知识

        在学习之前,我们必须熟知各类型的基本参数:

        unsigned类型

        unsigned类型又称作无符号型,区别于其他类型的最高以为是符号位,unsigned类型是没有最高位的符号位的,也就是说对于某个八位类型来说,该类型的取值范围在-128~127,而unsigned 该类型的取值范围则是0~255;

        char类型

        一个char类型占一个字节、8位,对于汉字来说,一个汉字需要两个char字符来存储,而对于英文、数字来说,一个字符占一个char字符的位置。

        unsigned char类型

        这是单片机中非常常见的类型,部分类库会将其typedef为uint8、uint8_t类型,unsigned char类型的取值范围为0~255

        HEX传输

        HEX即十六进制,代表数据以十六进制传输,一般我们常用来组帧或者向硬件发送协议。

        ASCII传输

        ASCII传输是常用的字符串与数值的传输方式,其简单、可靠,在日常的串口通信场景中,常用与特定可阅读的指令的通信。

三、开发环境搭建

        为熟悉开发过程中,传输字符串、数据、十六进制在unsigned char类型中所占长度以及其他的情况,需要开发一款随时接受并输出每个字符的程序。

        下面我们使用STM32芯片,将程序开发出来,由于程序开发较为简单,有需要的朋友可以参考博文:TM32单片机开发-UART&USART串口收发-STM32CubeMx项目生成

        学习理论的开发者可以不跟随本文开发串口程序,紧跟本文思路即可。

        首先初始化串口,本文使用波特率:38400

        程序也十分简单,一个输入函数,一个输出函数。

  1. #include "usart1-board.h"
  2. uint8_t data[10];
  3. uint16_t len;
  4. int main( void )
  5. {
  6. Init();
  7. USART1_Init(38400);
  8. while( 1 )
  9. {
  10. len=USART1_ReadRxBuffer(data);
  11. USART1_SendStr(data,len);
  12. }
  13. }

        我们对代码进行一下改进,让其能输出接收到的字符长度,即输出len。

  1. uint8_t data[10];
  2. uint16_t len;
  3. int main( void )
  4. {
  5. Init();
  6. USART1_Init(38400);
  7. while( 1 )
  8. {
  9. HAL_Delay(100);
  10. len=USART1_ReadRxBuffer(data);
  11. if(len!=0)
  12. {
  13. USART1_SendStr(data,10);
  14. USART1_SendData(len);
  15. memset(data,'\0',10);
  16. }
  17. }
  18. }

        将程序编译并烧录至开发板,打开串口调试助手,波特率38400,我们开始调试。

四、实验过程

        我们首先通过串口调试助手发送某个长度的浮点型数据,观察单片机返回的数据与长度。

        这是在ASCII模式下接受返回数据,于是我们改为ASCII发送,HEX接受。

        通过观察返回数据,可以得出长度为5,因此对于发送的ASCII数据来说,每位均代表一个Hex字符,我们继续实验,将105.2与31 30 35 2E 32对应起来,则‘.’应该对应十六进制2E,我们测试一下。

        通过实验,发现其确实是一一对应起来的,这也为后续我们传输多个数据打开思路。

        我们继续实验,探究汉字与unsigned char字符的关系。

        正如我们所料,我们发送三个汉字实际接收长度为6个字符,即一个汉字占两个字符。

        下面我们更改单片机程序,使用printf尝试打印ASCII格式的数据。

  1. float val=102.5;
  2. int main( void )
  3. {
  4. Init();
  5. USART1_Init(38400);
  6. while( 1 )
  7. {
  8. sprintf((char *)data,"A%.1f",val);
  9. USART1_SendStr(data,sizeof(data));
  10. HAL_Delay(1000);
  11. }
  12. }

         下面我们烧录程序,烧录是需要关闭串口调试助手,防止冲突。

        随后我们继续打开串口调试助手调试,理想的输出结果应该是:A102.5,位数应该为6位

        根据串口助手发来的数据,我们可以判断推测成立,那么我们能否规定长度呢,返回并继续更改源代码。

  1. float val=102.5;
  2. int main( void )
  3. {
  4. Init();
  5. USART1_Init(38400);
  6. while( 1 )
  7. {
  8. sprintf((char *)data,"A%4.1f",val);
  9. USART1_SendStr(data,sizeof(data));
  10. HAL_Delay(1000);
  11. }
  12. }

        打开串口调试助手,通过规定格式化%4.1f可以将格式限制在4字符,有效的保证了数据传输的可靠。

五、规律总结

        串口进行多个数据收发时,必须要熟知uisigned char类型的相关参数,通过本文总结的规律,在单片机开发时,多个传感器的数据传输可以通过指定位数来进行,大大提高了效率,节约时间。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/399668
推荐阅读
相关标签
  

闽ICP备14008679号