STM32 自定义UART数据格式(串口通信点亮LED实验)

news2025/1/11 8:16:18

起始位:0xaa告诉机器我们要开始传输数据了。

校验位:等于前几项数据位的相加。

结束位:结束传输。 

自定义UART数据格式:

1》CPU与CPU之间

2》外设与CPU之间

这里举例,利用串口调试助手发送一串数据,来控制4个LED灯。

数据格式

起始位数据位1(灯的编号)数据位2(点亮或者熄灭)校验位停止位
0xaa0x01/02/03/040x00/01数据位1+数据位20xff

例如

LED1点亮:aa 01 01 02 ff

LED2熄灭:aa 02 00 02 ff

  1. 先对串口中断和UART进行配置
    void Uart1_Configuration(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   //TX
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   //TX
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	USART_InitStructure.USART_BaudRate = 115200;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;
    	USART_InitStructure.USART_Parity = USART_Parity_No;
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    	USART_Init(USART1, &USART_InitStructure);
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    	USART_Cmd(USART1, ENABLE);
    }
    
    void Uart1_NVIC_Init(void)
    {
    	NVIC_InitTypeDef NVIC_InitStructure;
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);	
    	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    }
  2. LED配置
    void Led_Configuration(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
  3.  UART中断
    void control_LED(unsigned int led_number, unsigned int status)
    {
    	GPIO_WriteBit(GPIOA, (uint16_t)1<<led_number, (BitAction)status);
    }
    void USART1_IRQHandler(void)
    {
    	static unsigned int i = 1;
    	static unsigned int flag = 0;
    	
    	static unsigned int arr[5] = {0, 0, 0, 0, 0};
    	
    	unsigned char ch;
    	while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
    	{
    		ch = USART_ReceiveData(USART1);
    		if(ch == 0xaa)
    		{
    			arr[0] = ch;
    			flag = 1;
    		}
    		if(ch != 0xaa && flag == 1)
    		{
    			arr[i++] = ch;
    			
    			if(i == 5)
    			{
    				flag = 0;
    				i = 1;
    				if(((arr[i]+arr[2]) == arr[3]) && arr[4] == 0xff)
    					control_LED(arr[1], arr[2]);
    			}
    		}
    	}			
    }

            static unsigned int arr[5] = {0, 0, 0, 0, 0};如果直接定义arr,这样每次进中断arr都会被初始化为0,所以我们必须在arr的定义类型前加static,把它变为全局变量。这样arr只会在第一次的时候初始化,随后每次进中断时arr都不会被重新赋值了。

                同理这里定义flag,用来判断,是否开始传输,是则为1,否则为0。

本实验接线:TTL:RX》A10,TX》A9,5V》5V,GND》GND,4个LED灯接在A1,A2,A3,A4,

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

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

相关文章

Qt实现右键菜单

一、实现方法 QWidget提供了虚函数: virtual void contextMenuEvent(QContextMenuEvent*event);覆写该函数&#xff0c;即可。 二、Example 创建一个基本的mainwindow项目&#xff0c; 头文件&#xff1a; class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWin…

在AI时代我们的必修课,从提示词工程到大语言模型,进行多场景实战的经验分享总结

在AI时代&#xff0c;我们正面临着与人工智能技术日益紧密相连的需求和挑战。无论是从事计算机科学、数据科学还是其他相关领域的人员&#xff0c;都需要掌握AI技术&#xff0c;并将其应用到不同的场景中。本文将分享一些经验总结&#xff0c;帮助读者在多种场景下进行AI实战。…

linux NAT网卡配置static

由于是内网&#xff0c;资料无法拷贝&#xff0c;借助参考资料&#xff0c;整理发出。 镜像安装 基本操作。 查看VM配置 图1&#xff0c;有几个信息。一个是NAT借用了网卡里的VMnet8适配器。 子网IP是从192.168.142.0 子网掩码255.255.255.255&#xff0c;对应下面配置的N…

后端项目操作数据库增删改查-使用MyBatis配置实现数据操作

一、创建一个数据表对应的实体类 在src/main/java/包名/路径下新建pojo.entity文件夹&#xff0c;如com.luoyang.small.pojo.entity&#xff0c;并在该文件夹下新增实体类java文件&#xff1a;如相册Album.java 该实体类的属性应与数据表的字段对应 数据表样例如下&#xff1a…

Quest 3圆满结束,500万SUI正在送出!

的最后审核阶段于北京时间今日凌晨结束并公布了获奖情况&#xff0c;此次总奖池金额达到了500万SUI&#xff0c;共有16.4万参与者获得了奖励。参与Quest 3的人们可以在Sui网络上的九款游戏中进行选择&#xff0c;并利用促销活动注册SuiNS域名。 Quest 3以游戏为重点&#xff0…

spring boot 2 升级到 spring boot 3 后文件上传失败

背景 项目需要&#xff0c;要求升级 spring boot 2.7 到 spring boot 3.2&#xff0c;升级过程中发现很多不兼容问题&#xff0c;下面说明文件上传失败的解决方案。 问题 spring boot 2 中不需要额外的配置&#xff0c;直接在 Controller 中配置 MultipartFile 接收页面传的…

python之pyqt专栏5-信号与槽1

在上一篇文章&#xff0c;我们了解到如果想要用代码改变QLabel的文本内容&#xff0c;可以调用QLabel类的text()函数。 但是现在有个这样的需求&#xff0c;界面中有一个Button与一个Label&#xff0c;当点击Button时&#xff0c;将Label的内容改变为“Hello world&#xff01;…

全网最新最全面的Jmeter接口测试:jmeter模拟http请求实战

1、get请求 http://www.hnxmxit.com/ 2、带参数的get请求 微信公众号获取token请求 3、自定义头部信息的请求 百度搜索请求 https://www.baidu.com/s?wd猫 4、post请求 微信公众号添加用户标签请求 注&#xff1a;post请求中如果body中的数据为json,一定要在信息头管理器中…

【SpringBoot系列】SpringBoot时间字段格式化

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

袋鼠云产品功能更新报告08期|近百项全新功能和优化,你要的都在这里!

欢迎来到袋鼠云08期产品功能更新报告&#xff01;在瞬息万变的市场环境中&#xff0c;我们深知客户的需求与期待&#xff0c;因此&#xff0c;我们及时推出袋鼠云最新产品更新及优化&#xff0c;包括数据治理中心、Hive SQL 性能优化、新插件等&#xff0c;助力企业在数字世界中…

基于OpenSSL和nginx搭建本地https服务器(详细实操版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

【从删库到跑路 | MySQL总结篇】索引的详细使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、索引…

PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程

目前&#xff0c;问答网站已经成为人们获取知识、交流思想的重要平台。然而&#xff0c;对于许多开发者来说&#xff0c;从头开始构建一个问答网站可能会面临各种挑战。今天&#xff0c;小编给大家介绍一款基于PHP的开源问答网站平台源码系统&#xff0c;它不仅源码全部开源&am…

Apache2.4 AliasMatch导致301重定向问题?

环境&#xff1a;ubuntu18.04-desktop apache2版本&#xff1a; rootubuntu:/etc/apache2# apache2ctl -v Server version: Apache/2.4.29 (Ubuntu) Server built: 2023-03-08T17:34:33apache配置&#xff1a; DocumentRoot /var/www/html # Alias就没事 # Alias "/my…

05-基于Git的团队合作和跨团队合作方式

Git团队合作 团队协作 第一步: 在管理员的仓库中如git-shTest选择Settings-->Manage access-->invite a collaborator-->在弹出的界面中填入想要合作的人的GitHub账号 第二步: 管理员如yueyue复制邀请函中的地址内容通过微信钉钉等方式发送给该用户如atguigulinghuc…

Jetson Nano部署YOLOv5与Tensorrtx加速

一、烧录镜像 1、Jetson Nano烧写系统镜像 Jetson Nano是一款形状、外接口类似于树莓派的嵌入式主板&#xff0c;搭载了四核Cortex-A57处理器&#xff0c;GPU则是拥有128个NVIDIA CUDA核心的NVIDIA Maxwell架构显卡&#xff0c;内存为4GB的LPDDR4&#xff0c;存储则为16GB eM…

32岁,大专,转行网络工程师可行吗?

中午好&#xff0c;我是老杨。 32岁&#xff0c;是一个距离35岁不远不近的年纪&#xff0c;在IT行业里&#xff0c;也是一个最为尴尬的年纪。 年过三十&#xff0c;很多人在既有岗位做的麻木&#xff0c;想要跳槽&#xff0c;又怕承担动荡的风险&#xff1b; 到了这个年纪猜…

计算机新建盘符和重新分配盘符的大小

一、新建盘符 有些电脑刚买来时候&#xff0c;只有一个C盘分区&#xff0c;此时最好增加几个分区方便使用。 注意&#xff1a;分区操作要慎重&#xff0c;不要轻易去试。这里只针对购买的电脑厂家未做分区&#xff0c;只有一个C盘的情况。 如果自己电脑的分区本身已经满足你…

传统算法:使用 Pygame 实现插入排序

使用 Pygame 模块实现了插入排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过插入排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序将当前元素插入到已排序的部分,通过适度的延迟…

数字化IT合同管理软件, 实现高效合同管理!

在现代商业环境中&#xff0c;合同是商业活动中不可或缺的一部分。无论是与供应商、客户还是员工之间的合作&#xff0c;合同管理都是非常重要的。然而&#xff0c;传统的手动合同管理过程往往繁琐且易错&#xff0c;导致时间和资源的浪费&#xff0c;为了解决这些问题&#xf…