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

一、概述

        在常见的串口数据传输中,我们所熟知单片机常常传递的是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类型中所占长度以及其他的情况,需要开发一款随时接受并输出每个字符的程序。

扫描二维码关注公众号,回复: 14813433 查看本文章

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

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

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

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

#include "usart1-board.h"
uint8_t data[10];
uint16_t len;
int main( void )
{
    Init();
		USART1_Init(38400);
    while( 1 )
    {
			len=USART1_ReadRxBuffer(data);
			USART1_SendStr(data,len);
    }
}

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

uint8_t data[10];
uint16_t len;
int main( void )
{
    Init();
		USART1_Init(38400);
    while( 1 )
    {
			HAL_Delay(100);
			len=USART1_ReadRxBuffer(data);
			if(len!=0)
			{
				USART1_SendStr(data,10);
				USART1_SendData(len);
				memset(data,'\0',10);
				
			}
    }
}

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

四、实验过程

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

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

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

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

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

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

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

float val=102.5;
int main( void )
{
    Init();
	USART1_Init(38400);
    while( 1 )
    {
			sprintf((char *)data,"A%.1f",val);
			USART1_SendStr(data,sizeof(data));
			HAL_Delay(1000);
    }
}

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

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

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

float val=102.5;
int main( void )
{
    Init();
	USART1_Init(38400);
    while( 1 )
    {
			sprintf((char *)data,"A%4.1f",val);
			USART1_SendStr(data,sizeof(data));
			HAL_Delay(1000);
    }
}

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

五、规律总结

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

猜你喜欢

转载自blog.csdn.net/qq_39724355/article/details/127622274