赞
踩
在常见的串口数据传输中,我们所熟知单片机常常传递的是unsigned char的数组,也有部分类库会定义成uint8、uint8_t的类型,但其本质上仍是char类型。
而我们常见的串口通信一般分为两种格式,分别为ASCII与HEX传输,这也决定着数据接收方解析方式的不同。
在某些情况下,我们需要用串口发送一些特殊的文本,其中不乏包含数据、格式等信息,我们需要正确了解其数据对应unsigned char的格式,就可以做到对数据的解析。
在学习之前,我们必须熟知各类型的基本参数:
unsigned类型又称作无符号型,区别于其他类型的最高以为是符号位,unsigned类型是没有最高位的符号位的,也就是说对于某个八位类型来说,该类型的取值范围在-128~127,而unsigned 该类型的取值范围则是0~255;
一个char类型占一个字节、8位,对于汉字来说,一个汉字需要两个char字符来存储,而对于英文、数字来说,一个字符占一个char字符的位置。
这是单片机中非常常见的类型,部分类库会将其typedef为uint8、uint8_t类型,unsigned char类型的取值范围为0~255
HEX即十六进制,代表数据以十六进制传输,一般我们常用来组帧或者向硬件发送协议。
ASCII传输是常用的字符串与数值的传输方式,其简单、可靠,在日常的串口通信场景中,常用与特定可阅读的指令的通信。
为熟悉开发过程中,传输字符串、数据、十六进制在unsigned char类型中所占长度以及其他的情况,需要开发一款随时接受并输出每个字符的程序。
下面我们使用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类型的相关参数,通过本文总结的规律,在单片机开发时,多个传感器的数据传输可以通过指定位数来进行,大大提高了效率,节约时间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。