stm32入门-----USART串口实现数据包的接收和发送

news2024/11/23 15:30:40

 目录

前言

 数据包

1.HEX数据包

2.文本数据包

C编程实现stm32收发数据包

1.HEX数据包的收发

2.文本数据包的收发       


前言

        前面几期讲解了USART串口发送数据和接收数据的原理,那本期在前面的基础上学习stm32 USART串口发送和接收数据包。本期包括两个项目,分别是USART发送HEX数据包和USART发送文本数据包。(视频:[9-4] USART串口数据包_哔哩哔哩_bilibili        [9-5] 串口收发HEX数据包&串口收发文本数据包_哔哩哔哩_bilibili)

 本期项目工程代码以上传至百度网盘可自行下载。

链接:https://pan.baidu.com/s/1EDoAsXeJFw-mfhj0DQAnUA?pwd=0721 
提取码:0721

 数据包

        数据包我们其实都不陌生的,比如在网上在发送文件或消息给对方的时候实际上就是发送一个数据包,这个数据包是以编码后的形式来去传输的。数据包可以分为三个部分,分别是起始区域,数据存储区域,终止区域。当检测到起始区域的时候就开始对数据包进行读取操作,直到终止区域就结束读取操作,这里我们学习stm32要用到的数据包有两种,分别是HEX数据包和文本数据包。下面就分别进行一一讲解。

1.HEX数据包

这一类数据包实际上是单片机与其他设备之间通讯的传输流数据包,是机器之间通讯的数据,其是一种十六进制的数据。就数据包来说可以分为有固定长度的数据包和无固定长度的数据包。

对于HEX数据包去定义长度是为了避免包头和包尾出现与数据域的数据值重复(比如包头尾0xFF 紧接着后面的数据又出现0xFF,或者结尾尾0xFE的前面一个数据也是0xFE),如果不定义长度的话这会导致接收的时候不知道哪里是开头,这会使得数据接收出问题,所以去定义长度,当读取到达我们要求的长度的时候就结束。

  • 固定包长,含包头包尾

  • 可变包长,含包头包尾 

        HEX数据包的接收要分三步走,第一就是去检查包头,如果拿到了包头的话就可以继续读取操作跳转到S=1步骤,如果没有拿到的话就会原路返回出于一直等待状态。然后就是接收数据域的数据,假如是固定长度的数据,那就进行数据量统计,边获取边统计,统计到足够的时候就结束,跳转到S=2包尾。

2.文本数据包

同样的,文本数据包也是分为有固定长度的数据包和无固定长度的数据包。

  • 固定包长,含包头包尾

  •  可变包长,含包头包尾 

 对于文本数据包的获取,我们同样也是需要去定义包头和包尾,但是对于文本数据包一般包头和包尾出都是相对比较特殊的字符,所以基本上不会涉及到数据域与包头和包尾发送冲突,可以去用不固定长度数据的形式来作为数据包。其接收过程也是跟HEX的过程一样的。

C编程实现stm32收发数据包

 本次实验的代码是在上一期的基础上进行修改就可以实现数据包的发送,如果有相关函数以及操作不了解的可以查看上一期内容:stm32入门-----USART串口通讯(上——实践篇)-CSDN博客

1.HEX数据包的收发

先看实验现象:

这个是串口接收和发送的数据。

OLED屏幕的显示结果如下: 电路连线图如下,当按下按键的时候stm32就会向电脑发送数据包。

       工程文件:

Serial.h代码如下,这里展示要用到的相关函数以及变量,如果想去查看整个工程代码可以去上面的百度网盘下载。

#ifndef __SERIAL_H
#define __SERIAL_H
#include <stdio.h>

extern uint8_t Serial_Txpacket[];
extern uint8_t Serial_Rxpacket[];

void Serial_init();
void Serial_sendbyte(uint8_t byte);
void Serial_sendarray(uint8_t * array,uint16_t length);
void Serial_sendstring(char* string);
void Serial_sendnumber(uint32_t num,uint8_t length);
void Serial_sprintf(char* format,...);
void Serial_sendpacket();

#endif // !__

 main.c文件代码如下

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "Key.h"

uint8_t data;
uint8_t flag; //中断结束标志
uint8_t keynum;

uint8_t Serial_getflag();
uint8_t Serial_getdata();

int main(void)
{	
	OLED_Init();
	Serial_init();
	Key_init();	
	//要发送的初始数据包
	Serial_Txpacket[0] = 0x01;
	Serial_Txpacket[1] = 0x02;
	Serial_Txpacket[2] = 0x03;
	Serial_Txpacket[3] = 0x04;

	OLED_ShowString(1, 1, "Txpacket:");
	OLED_ShowString(3, 1, "Rxpacket:");
	
	while (1) {
		keynum = Keynum();

		//点击按键单片机发送给电脑
		if (keynum == 1) {
			//对数据进行每一个+1处理
			Serial_Txpacket[0]++;
			Serial_Txpacket[1]++;
			Serial_Txpacket[2]++;
			Serial_Txpacket[3]++;
			
			Serial_sendpacket(); //发送数据

			OLED_ShowHexNum(2, 1, Serial_Txpacket[0], 2);
			OLED_ShowHexNum(2, 4, Serial_Txpacket[1], 2);
			OLED_ShowHexNum(2, 7, Serial_Txpacket[2], 2);
			OLED_ShowHexNum(2, 10, Serial_Txpacket[3], 2);
		}

		// 这里是单片机接收电脑的数据
		if (Serial_getflag() == 1) {
			OLED_ShowHexNum(4, 1, Serial_Rxpacket[0], 2);
			OLED_ShowHexNum(4, 4, Serial_Rxpacket[1], 2);
			OLED_ShowHexNum(4, 7, Serial_Rxpacket[2], 2);
			OLED_ShowHexNum(4, 10, Serial_Rxpacket[3], 2);
		}

	}
}

//获取中断结束标志位
uint8_t Serial_getflag() {
	if (flag) {
		flag = 0;
		return 1;
	}
	return 0;
}
//获取数据
uint8_t Serial_getdata() {
	return data;
}
//中断读取接收,这是一个一个byte来接收的
void USART1_IRQHandler() {
	static uint8_t Rxstate = 0;//局部静态变量表示S,0,1,2对应的状态
	static uint8_t curpacket = 0;
	//先判断标志位
	if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) {
		uint8_t Rxdata = USART_ReceiveData(USART1);//获取一个byte的数据
		// S=0 进入包头位置
		if (Rxstate == 0) {
			if (Rxdata == 0xFF) { //进入到下一个状态 S=1 开始读取数据
				Rxstate = 1;
				curpacket = 0;
			}
		}
		//S=1 读取数据状态
		else if (Rxstate == 1) {
			Serial_Rxpacket[curpacket++] = Rxdata;
			if (curpacket >= 4) {
				Rxstate = 2;
			}
		}
		// S=2 数据读取结束状态
		else if (Rxstate == 2) {
			if (Rxdata == 0xFE) {
				Rxstate = 0;
				flag = 1; //中断结束falg=1
			}
		}
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除中断标志位
	}
}

2.文本数据包的收发       

实验现象:

这里会去检测发送的文本数据包,如果发送的是 @ON 那就表示开灯 ,如果发送@OFF 是表示关灯,如果发送其他的数据包会显示指令错误。下面是串口调试助手的现象。

USART串口发送文本数据包

发送@ON 数据的时候就表示开灯,现象如下:

发送@OFF 表示关灯,现象如下: 

电路连线图:                                                                                                                                     

工程文件:

main.c文件代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"
#include "Key.h"
#include <string.h>

uint8_t data;
uint8_t flag;
uint8_t keynum;

uint8_t Serial_getflag();
uint8_t Serial_getdata();

int main(void)
{	
	OLED_Init();
	Serial_init();
	Key_init();
	LED_init();
	OLED_ShowString(1, 1, "Txpacket:");
	OLED_ShowString(3, 1, "Rxpacket:");
	
	while (1) {
		if (flag == 1) {
			OLED_ShowString(4, 1, "                "); //擦除第四行
			OLED_ShowString(4, 1, Serial_Rxpacket);
			//字符串匹配用string库里面的strcmp函数,大家都再熟悉不过了
			if (strcmp(Serial_Rxpacket, "ON")==0) {
				LED1_ON();
				Serial_sendstring("LED_ON_OK\r\n");
				OLED_ShowString(2, 1, "                "); //擦除
				OLED_ShowString(2, 1, "LED_ON_OK");
			}
			else if (strcmp(Serial_Rxpacket, "OFF")==0) {
				LED1_OFF();
				Serial_sendstring("LED_OFF_OK\r\n");
				OLED_ShowString(2, 1, "                "); //擦除
				OLED_ShowString(2, 1, "LED_OFF_OK");
			}
			else {
				Serial_sendstring("ERROR_COMMAND\r\n");
				OLED_ShowString(2, 1, "                "); //擦除
				OLED_ShowString(2, 1, "ERROR_COMMAND");
			}
			flag = 0;
		}

	}
}

//获取数据
uint8_t Serial_getdata() {
	return data;
}
//中断读取接收,这是一个一个byte来接收的
void USART1_IRQHandler() {
	static uint8_t Rxstate = 0;//局部静态变量表示s,0,1,2对应的状态
	static uint8_t curpacket = 0;
	//先判断标志位
	if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) {
		uint8_t Rxdata = USART_ReceiveData(USART1);
		//状态0
		if (Rxstate == 0) {
			if (Rxdata == '@' && flag==0) { //进入到下一个状态
				Rxstate = 1;
				curpacket = 0;
			}
		}
		//状态1
		else if (Rxstate == 1) {
			if (Rxdata == '\r') 
				Rxstate = 2; //接收完成跳转到状态2
			else
				Serial_Rxpacket[curpacket++] = Rxdata;
		}
		//状态2
		else if (Rxstate == 2) {
			if (Rxdata == '\n') {
				Rxstate = 0;
				Serial_Rxpacket[curpacket] = '\0';//给字符串添加终止符
				flag = 1;
			}
		}
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除中断标志位
	}
}

以上就是本期的全部内容了,我们下一期见!

 今日壁纸:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库作业四

1. 修改 student 表中年龄&#xff08; sage &#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint &#xff1a; ALTER TABLE student MODIFY Sage SMALLINT; 2. 为 Course 表中 Cno 课程号字段设置索引&#xff0c;并查看索引&#xff1a; ALTER TABLE…

Linux系统下非root用户自行安装的命令切换为root权限时无法使用,提示comman not found解决办法

今天在开发的时候遇上了一个问题就是要去我们数据平台中进行数据的提取&#xff0c;数据存储用的是minio&#xff0c;一个MinIO部署由一组存储和计算资源组成&#xff0c;运行一个或多个 minio server 节点&#xff0c;共同作为单个对象存储库。独立的MinIO实例由具有单个 mini…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器&#xff1a; 搭建DNS多区域功能&#xff08;Multi-Zone DNS&#xff09;主要是为了满足复杂网络环境下的多样化需求&#xff0c;提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境&#xff1a; 在大型组织、跨国公司或跨地域服务中&#xff0c;网…

微服务安全——SpringSecurity6详解

文章目录 说明SpringSecurity认证快速开始设置用户名密码基于application.yml方式基于Java Bean配置方式 设置加密方式自定义用户加载方式自定义登录页面前后端分离认证认证流程 SpringSecurity授权web授权:基于url的访问控制自定义授权失败异常处理方法授权:基于注解的访问控制…

2024上半年热门网络安全产品和工具TOP10_wiz安全产品

今年上半年&#xff0c;利用生成式人工智能&#xff08;GenAI&#xff09;的网络安全工具继续激增。许多供应商正在利用GenAI的功能来自动化安全运营中心&#xff08;SOC&#xff09;的工作&#xff0c;特别是在自动化日常活动方面&#xff0c;如收集威胁信息和自动创建查询。 …

element 结合 {} 实现自适应布局

通过el-row el-col 实现 例如 :xl“{ 1: 24, 2: 12, 3: 8, 4: 6 }[tableData.length] || 6” length 1 2 3 4 、代码数量为 1 2 3 4 >4 时不同卡片数量时尺寸的配置

LLM模型之基于MindSpore通过GPT实现情感分类

前言 # 该案例在 mindnlp 0.3.1 版本完成适配&#xff0c;如果发现案例跑不通&#xff0c;可以指定mindnlp版本&#xff0c;执行!pip install mindnlp0.3.1 !pip install mindnlp !pip install jieba %env HF_ENDPOINThttps://hf-mirror.com 导入对应的包 import osimport m…

【因数之和】python求解方法

输入两个整数A和B&#xff0c;求A的B次方的因子和&#xff0c;结果对1000000007取模。 def mod_exp(base, exp, mod):result 1while exp > 0:if exp % 2 1:result (result * base) % modbase (base * base) % modexp // 2return resultdef sum_of_factors(n):total 0…

讨逆猴子剪切板,浏览器复制失败?

讨逆猴子剪切板&#xff0c;复制失败&#xff1f; 问题&#xff1a;本地开发情况下可以直接复制&#xff0c;公网就不行了…触发了安全机制。 const link 内容;navigator.clipboard.writeText(link);报错&#xff1a; 解决方案&#xff1a; if (navigator.clipboard &&…

使用大型语言模型进行文档解析(附带代码)

动机 多年来&#xff0c;正则表达式一直是我解析文档的首选工具&#xff0c;我相信对于许多其他技术人员和行业来说也是如此。 尽管正则表达式在某些情况下功能强大且成功&#xff0c;但它们常常难以应对现实世界文档的复杂性和多变性。 另一方面&#xff0c;大型语言模型提供了…

5.CSS学习(浮动)

浮动&#xff08;float&#xff09; 是一种传统的网页布局方式&#xff0c;通过浮动&#xff0c;可以使元素脱离文档流的控制&#xff0c;使其横向排列。 其编写在CSS样式中。 float:none(默认值) 元素不浮动。 float:left 设置的元素在其包含…

【计算机网络】单臂路由实现VLAN间路由实验

一&#xff1a;实验目的 1&#xff1a;掌握如何在路由器端口上划分子接口&#xff0c;封装dot1q协议&#xff0c;实现VLAN间的路由。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。具体为&#xff1a;路由器…

git学习笔记(总结了常见命令与学习中遇到的问题和解决方法)

前言 最近学习完git&#xff0c;学习过程中也遇到了很多问题&#xff0c;这里给大家写一篇总结性的博客&#xff0c;主要大概讲述git命令和部分难点问题&#xff08;简单的知识点这里就不再重复讲解了&#xff09; 一.git概述 1.1什么是git Git是一个分布式的版本控制软件。…

SQL Developer 连接 MySQL

服务&#xff1a; $ sudo systemctl list-unit-files | grep enabled | grep mysql mysqld.service enabled日志&#xff1a; mysqld.log # sudo grep temporary password /var/log/mysqld.log 2024-05-28T00:57:16.676383Z 6 [Note] [MY…

GB28181摄像头管理平台WVP视频平台SQL注入漏洞复现 [附POC]

文章目录 GB28181摄像头管理平台WVP视频平台SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 GB28181摄像头管理平台WVP视频平台SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内…

AI带货直播软件开发会用到哪些源代码?

随着人工智能技术的迅猛发展&#xff0c;AI带货直播软件已成为电商领域的一股新兴力量&#xff0c;这类软件通过结合AI技术、虚拟形象和实时互动功能&#xff0c;极大地提升了用户体验和购买转化率。 在开发这类软件的过程中&#xff0c;源代码的编写至关重要&#xff0c;本文…

20 B端产品的数据分析

数据分析的价值 数据衡量业务&#xff1a;通过管理数据报表&#xff0c;可以快速衡量业务发展状态。 数据洞察业务&#xff1a;通过数据分析&#xff0c;可以找到业务发展的机遇。 数据驱动指导业务&#xff1a;基于数据&#xff0c;驱动业务决策&#xff0c;数据支撑决策。 …

python+vue3+onlyoffice在线文档系统实战20240726笔记,左侧菜单实现和最近文档基本实现

解决右侧高度过高的问题 解决方案&#xff1a;去掉右侧顶部和底部。 实现左侧菜单 最近文档&#xff0c;纯粹文档 我的文档&#xff0c;既包括文件夹也包括文件 共享文档&#xff0c;别人分享给我的 基本实现代码&#xff1a; 渲染效果&#xff1a; 简单优化 设置默认菜…

K8S 部署peometheus + grafana 监控

安装说明 如果有下载不下来的docker镜像可以私信我免费下载。 系统版本为 Centos7.9 内核版本为 6.3.5-1.el7 K8S版本为 v1.26.14 动态存储&#xff1a;部署文档 GitHub地址 下载yaml 文件 ## 因为我的K8S 版本比较新&#xff0c;我下载的是当前的最新版本&#xff0c;你的要…

【10.PIE-Engine案例———— 加载Terra星全球1km地表温度和发射率每日天合成产品(MOD11A1 V61)数据集】

加载Terra星全球1km地表温度和发射率每日天合成产品(MOD11A1 V61)数据集 原始路径 欢迎大家登录航天宏图官网查看本案例原始来源 最终结果 具体代码 /*** File : MOD11A1* Time : 2020/7/21* Author : piesat* Version : 1.0* Contact : 400-890-0662* Li…