打印
[其他ST产品]

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

[复制链接]
769|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
概述
        在常见的串口数据传输中,我们所熟知单片机常常传递的是unsigned char的数组,也有部分类库会定义成uint8、uint8_t的类型,但其本质上仍是char类型。

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

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

使用特权

评论回复
沙发
实际测量不符|  楼主 | 2023-5-30 16:35 | 只看该作者
二、基础知识
        在学习之前,我们必须熟知各类型的基本参数:

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

使用特权

评论回复
板凳
实际测量不符|  楼主 | 2023-5-30 16:36 | 只看该作者
三、开发环境搭建
        为熟悉开发过程中,传输字符串、数据、十六进制在unsigned char类型中所占长度以及其他的情况,需要开发一款随时接受并输出每个字符的程序。

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

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

使用特权

评论回复
地板
实际测量不符|  楼主 | 2023-5-30 16:37 | 只看该作者
  首先初始化串口,本文使用波特率:38400

使用特权

评论回复
5
实际测量不符|  楼主 | 2023-5-30 16:37 | 只看该作者
    程序也十分简单,一个输入函数,一个输出函数。
#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);
    }
}

使用特权

评论回复
6
实际测量不符|  楼主 | 2023-5-30 16:38 | 只看该作者
  我们对代码进行一下改进,让其能输出接收到的字符长度,即输出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);
                               
                        }
    }
}

使用特权

评论回复
7
实际测量不符|  楼主 | 2023-5-30 16:39 | 只看该作者
    将程序编译并烧录至开发板,打开串口调试助手,波特率38400,我们开始调试。

使用特权

评论回复
8
实际测量不符|  楼主 | 2023-5-30 16:45 | 只看该作者
四、实验过程
        我们首先通过串口调试助手发送某个长度的浮点型数据,观察单片机返回的数据与长度。

使用特权

评论回复
9
实际测量不符|  楼主 | 2023-5-30 16:46 | 只看该作者
   这是在ASCII模式下接受返回数据,于是我们改为ASCII发送,HEX接受。

使用特权

评论回复
10
实际测量不符|  楼主 | 2023-5-30 16:46 | 只看该作者
     通过观察返回数据,可以得出长度为5,因此对于发送的ASCII数据来说,每位均代表一个Hex字符,我们继续实验,将105.2与31 30 35 2E 32对应起来,则‘.’应该对应十六进制2E,我们测试一下。

使用特权

评论回复
11
实际测量不符|  楼主 | 2023-5-30 16:46 | 只看该作者
  通过实验,发现其确实是一一对应起来的,这也为后续我们传输多个数据打开思路。

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

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

使用特权

评论回复
12
实际测量不符|  楼主 | 2023-5-30 16:48 | 只看该作者
     下面我们更改单片机程序,使用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);
    }
}

使用特权

评论回复
13
实际测量不符|  楼主 | 2023-5-30 16:48 | 只看该作者
     下面我们烧录程序,烧录是需要关闭串口调试助手,防止冲突。

使用特权

评论回复
14
实际测量不符|  楼主 | 2023-5-30 16:48 | 只看该作者

使用特权

评论回复
15
实际测量不符|  楼主 | 2023-5-30 16:49 | 只看该作者
随后我们继续打开串口调试助手调试,理想的输出结果应该是:A102.5,位数应该为6位

使用特权

评论回复
16
实际测量不符|  楼主 | 2023-5-30 16:50 | 只看该作者
根据串口助手发来的数据,我们可以判断推测成立,那么我们能否规定长度呢,返回并继续更改源代码。

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);
    }
}

使用特权

评论回复
17
实际测量不符|  楼主 | 2023-5-30 16:55 | 只看该作者
打开串口调试助手,通过规定格式化%4.1f可以将格式限制在4字符,有效的保证了数据传输的可靠。

使用特权

评论回复
18
实际测量不符|  楼主 | 2023-5-30 16:55 | 只看该作者
五、规律总结
        串口进行多个数据收发时,必须要熟知uisigned char类型的相关参数,通过本文总结的规律,在单片机开发时,多个传感器的数据传输可以通过指定位数来进行,大大提高了效率,节约时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

589

帖子

1

粉丝