【STM32】西南交大嵌入式实验四:异步串行通信

news2024/11/15 20:11:27

实验板串行相关电路:

数码管等外设的电路前面的实验已经提到过,不再赘述。

使用cubeMX配置项目:

因为数码管,蜂鸣器这些外设对应的引脚在前面的项目里已经配置过,可以选择前面的一个项目,另存为,就剩去再配置外设相关引脚的功夫。如下图:

跟之前的项目配置步骤差不多, 串口通信部分的配置步骤可以看正点原子的视频(第9讲和第10讲):

【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p=9&share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

串行口调试程序

串行口调试程序使用的sscom5.13.1,在老师发的工具文件夹里可以找到:

注意:端口的选择和数据发送的形式,图上的方框只是强调位置,并非是要选择成图里的样子。 

实验内容 

实验一要求

1、采用查询法编写串口程序,串行口波特率设置为 115200bps,数据字长 8 位,停止位 1 位,无校验。

(1)向串行口发送 1 个字符数据,开发板接收到数据后,将数据加一从串口发回。

(2)向串行口发送 1 个字符数据,开发板接收到数据后,判定数据为 Y 或者 y 跑马灯 全亮、数据为 N 或者 n 跑马灯全灭,其他字符,跑马灯旋转。

(3)重定向 printf、scanf 函数到串口。

这个实验很简单,这里只说(2)要求,只涉及到跑马灯的控制,写一个函数来控制:

void paoMaDeng(uint8_t flag){
	uint16_t x=0x0001;
	if(flag=='y'||flag=='Y'){
		   for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,x<<i,1);
		}
	}else if(flag=='n'||flag=='N'){
	   for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,x<<i,0);
		}
	}else{
    for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,x<<i,1);
			for(int i=0;i<1000000;i++);
			HAL_GPIO_WritePin(GPIOF,x<<i,0);
		}
	
	}
}

在while里的接收语句HAL_UART_Receive后,调用这个函数即可。 

while (1)
  {
		HAL_UART_Receive(&huart1,revbuf,sizeof(revbuf),HAL_MAX_DELAY);
		//printf("%c",revbuf[0]);
		
		//将数据加一从串口发回
		//revbuf[0]+=1;
		//1秒
		//HAL_UART_Transmit(&huart1,revbuf,sizeof(revbuf),1000);
		
		/*
		数据为 Y 或者 y 跑马灯全亮、数据为 N 或者 n 跑马灯全灭,其他字符,跑马灯旋转
		*/
		paoMaDeng(revbuf[0]);
		
  }

实验二要求:

(1)向串行口发送 1 个字符数据,开发板接收到数据后,将数据加一从串口发回。

(2)向串行口发送 1 个字符数据,开发板接收到数据后,判定数据为 Y 或者 y 跑马灯 全亮、数据为 N 或者 n 跑马灯全灭,其他字符,将数据的 ASCII 码显示在数码管上。 显示内容为 XXH。

数码管显示可以直接沿用前面实验的代码,但这里需要注意的是,前面实验的代码段码表只写了0到9的,这里需要补上A到F的,以及还需要显示H,H对应的段码是0x76。 

段码表:

unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x88,0x83,0xc6,0xa1,0x86,0x8e };

 为了让数码管在发送其他字符的时候一直显示,中断回调函数里不直接操作数码管进行显示,只将它的标志置1,然后主函数里的while里判断该标志,为1就进行显示,还要注意的是,中断回调函数里最后要调用一次HAL_UART_Receive_IT(&huart1,revbuf,sizeof(revbuf));以触发下次中断:

int shuMaGuan=0;
//16个字符,0-F
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x88,0x83,0xc6,0xa1,0x86,0x8e };
unsigned char s[]={0,0,0,0,0,0,7,15};

void write_byte(unsigned char date){
    unsigned char i;
	for(i=0;i<8;i++){
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(date>>(7-i))&0x01);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,0);
	}
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,1);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,0);
 
}
 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  if(huart->Instance==USART1)
	{
	  //revbuf[0]+=1;
	  //HAL_UART_Transmit_IT(&huart1,revbuf,sizeof(revbuf));
		uint16_t x=0x0001;
		uint8_t flag=revbuf[0];
	 if(flag=='y'||flag=='Y'){
		  shuMaGuan=0;
		   for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,x<<i,1);
		}
	}else if(flag=='n'||flag=='N'){
		shuMaGuan=0;
	   for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,x<<i,0);
		}
		}else{//为了一直显示数码管,这里只操作标志,在主函数里的while循环里实现显示效果
   shuMaGuan=1;
	 int temp=(int)revbuf[0];
	 s[7]=temp%16;
	 s[6]=temp/16%16;	
		
	}
		
		HAL_UART_Receive_IT(&huart1,revbuf,sizeof(revbuf));
	
	}
}

主函数中: 

while (1)
  {
   
    if(shuMaGuan==1)
		{
		   
		write_byte(0x76);//显示'H'
		HAL_GPIO_WritePin(GPIOF,0x01<<8,0);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOF,0x01<<8,1);
			
	  for(int i=8;i<10;i++){
		write_byte(table[s[15-i]]);
		HAL_GPIO_WritePin(GPIOF,0x02<<i,0);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOF,0x02<<i,1);
		  }
	  }
   
  }

实验三

3、构建发送和接收缓冲区,编写发送和接收单字节、双字节、四字节和字符串发送函数。将接收到的字符串从串口发回,并在数码管上显示你接收到的字符串。

缓冲区可以建两个10字节的数组,比8字节要大一些。需要注意的是,要约定字符串结束的符号,接收到这个符号之后,这个字符串就发送结束了,比如约定以'\0'为结束,这个结束符也占一个字节。

实验四

采用中断法定义串口通讯协议,串行口波特率设置为 115200bps,数据字长 8 位,停 止位 1 位,无校验。通过串行口向蜂鸣器、电机、跑马灯和数码管发送 5 字节命令。

因为是5字节命令,校验字节用00来占位。

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

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

相关文章

[Kubernetes] sealos部署 K8s 集群

文章目录 1.sealos 介绍2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.sealos 介绍 Sealos 是一个基于 Kubernetes 内核的云操作系统发行版。它采用云原生方式&#xff0c;摒弃传统的云计算架构&#xff0c;转向以 Kubernetes 为云内核的新架构。这使得企…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型&#xff0c;然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

C/C++ 初级球球大作战练手

效果演示&#xff1a; https://live.csdn.net/v/385490 游戏初始化 #include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsy…

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…

燃气电力瓶装气行业入户安检小程序开发

我们开发的小区业主入户安检小程序&#xff0c;旨在满足燃气、电力以及其他需要入户安检的行业需求。该程序支持自定义安检项目&#xff0c;实现线下实地安检与线上数据保存的完美结合。在安检过程中&#xff0c;我们可以拍照或录像&#xff0c;以确保安检的透明性和可追溯性&a…

亚马逊是如何铺设多个IP账号实现销量大卖的?

一、针对亚马逊平台机制&#xff0c;如何转变思路&#xff1f; 众所周知&#xff0c;一个亚马逊卖家只能够开一个账号&#xff0c;一家店铺&#xff0c;这是亚马逊平台明确规定的。平台如此严格限定&#xff0c;为的就是保护卖家&#xff0c;防止卖家重复铺货销售相同的产品&a…

Python | Leetcode Python题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution:def sortColors(self, nums: List[int]) -> None:n len(nums)p0, p2 0, n - 1i 0while i < p2:while i < p2 and nums[i] 2:nums[i], nums[p2] nums[p2], nums[i]p2 - 1if nums[i] 0:nums[i], nums[p0] num…

wePWNise:一款功能强大的红队Office宏VBA代码生成工具

关于wePWNise wePWNise是一款功能强大的Office宏VBA代码生成工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员生成用于Office宏或模版的VBA代码&#xff0c;并以此来测试目标Office环境、应用程序控制和防护机制的安全性。 wePWNise的设计理念将自动化…

LNMT部署jpress

LNMT部署jpress 环境要求&#xff1a; MySQL版本5.6/5.7 tomcat版本9.0.65 源码安装MySQL5.7版 //源码安装MySQL5.7版1关闭防火墙 2创建mysql用户 3上传mysql5.7包&#xff08;https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.g…

向量数据库:PGVector

一、PGVector 介绍 PGVector 是一个基于 PostgreSQL 的扩展插件&#xff0c;为用户提供了一套强大的向量存储和查询的功能&#xff1a; 精确和近似最近邻搜索单精度&#xff08;Single-precision&#xff09;、半精度&#xff08;Half-precision&#xff09;、二进制&#xff…

使用动态种子的DGA:DNS流量中的意外行为

Akamai研究人员最近在域名系统&#xff08;DNS&#xff09;流量数据中观察到&#xff1a;使用动态种子的域名生成算法&#xff08;Domain Generation Algorithm&#xff0c;DGA&#xff09;的实际行为&#xff0c;与对算法进行逆向工程推测的预期行为之间存在一些差异。也就是说…

【最大公约 调和级数 并集查找】2709. 最大公约数遍历

涉及知识点 最大公约 调和级数 并集查找&#xff08;并差集) 质数、最大公约数、菲蜀定理 LeetCode 2709. 最大公约数遍历 给你一个下标从 0 开始的整数数组 nums &#xff0c;你可以在一些下标之间遍历。对于两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;当且…

tsconfig 备忘清单

前言 ❝ Nealyang/blog0 使用 ts 已多年&#xff0c;但是貌似对于 tsconfig 总是记忆不清&#xff0c;每次都是 cv 历史项目&#xff0c;所以写了这篇备忘录&#xff0c;希望能帮助到大家。 本文总结整理自 Matt Pocock 的一篇文章3&#xff0c;加以个人理解&#xff0c;并做了…

SpringBoot 使用Outlook邮箱发送邮件

目录 一、开启Outlook设置 二、依赖 三、配置文件 四、代码调用 一、开启Outlook设置 开启设置如图&#xff1a; 二、依赖 <!-- 邮箱依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mai…

【SpringBoot整合系列】SpringBoot整合RabbitMQ-消息可靠性

目录 确保消息的可靠性RabbitMQ 消息发送可靠性分析解决方案开启事务机制发送方确认机制单条消息处理消息批量处理 失败重试自带重试机制业务重试 RabbitMQ 消息消费可靠性如何保证消息在队列RabbitMQ 的消息消费&#xff0c;整体上来说有两种不同的思路&#xff1a;确保消费成…

C++音视频开发面试题

下面是音视频开发面试题精选&#xff1a; 1、纹理抗锯齿有哪些算法&#xff1f;各有哪些利弊&#xff1f;2、使用 OpenGL PBO 为什么能提高效率&#xff1f;3、iOS 如何使用分段转码&#xff0c;如何设置分片大小&#xff1f;4、VideoToolbox 中是不是不存在平面格式&#xff…

C#调用电脑摄像头拍照

1.打开VS2019&#xff0c;新建一个Form窗体&#xff0c;工具->NuGet包管理工具->管理解决方案的NuGet包&#xff0c;在浏览里搜索AForge.Controls、AForge.Video.DirectShow&#xff0c;安装AForge.Controls和AForge.Video.DirectShow 2.安装AForge组件完成后&#xff0c…

AI 绘画神器 Fooocus 本地部署指南:简介、硬件要求、部署步骤、界面介绍

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 随着人工智能技术的飞速发展&#xff0c;AI 绘画逐渐成为创意领域的新宠。Fooocus 作为一款免费开源的 AI 绘画工具&am…

mysql等保测评2.0命令-三级

版本 Win默认安装位置 C:\Program Files\MySQL\MySQL Server 8.0\bin 版本&#xff1a;select version() from dual; 身份鉴别 a应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 1、SELEC…

html--瀑布效果

<!doctype html> <html> <head> <meta charset"utf-8"> <title>瀑布效果</title><style> body {background: #222;color: white;overflow:hidden; }#container {box-shadow: inset 0 1px 0 #444, 0 -1px 0 #000;height: 1…