第十五届蓝桥杯单片机国赛-串口解析

串口通信像是蓝桥杯单片机组国赛中一个若隐若现的秘境,总在不经意间为勇者们敞开大门。然而,初次探索这片领域的冒险者,常常会被其神秘莫测的特性所震慑,黯然退场(编不下去了,直接进入正题)。

附件:第十五届蓝桥杯单片机组国赛(串口部分)(

一、串口三部曲

1.串口初始化

相关原理:速通串口通信

在STC-ISP中按照以下步骤操作即可

在这里插入图片描述

在keil中新建uart.c和uart.h

  • uart.c
#include "uart.h"void Uart1_Init(void)	//9600bps@12.000MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x01;		//串口1选择定时器2为波特率发生器AUXR &= 0xFB;		//定时器时钟12T模式T2L = 0xE6;			//设置定时初始值T2H = 0xFF;			//设置定时初始值AUXR |= 0x10;		//定时器2开始计时ES = 1;				//使能串口1中断EA = 1;
}extern char putchar(char ch)
{SBUF = ch;while(!TI);TI = 0;return ch;
}

uart.h

#include <STC15F2K60S2.H>
#include <stdio.h>void Uart1_Init();

2.串口中断

  • main.c
typedef unsigned char u8;pdata u8 uartBuf[10] = {0,0,0,0,0,0,0,0,0,0};
idata u8 uartBufIndex;
idata u8 uartTick;
idata bit uartFlag;void Uart1_Isr(void) interrupt 4
{if(RI){uartFlag = 1;uartTick = 0;uartBuf[uartBufIndex++] = SBUF;RI = 0;}if(uartBufIndex > 10){uartTick = uartFlag = 0;uartBufIndex = 0;memset(uartBuf,0,10);}
}	

3.串口数据处理函数

#include <string.h>
#include <stdio.h>
#include <math.h>void uartProc()
{if(!uartBufIndex) return;if(uartTick >= 10){uartTick = uartFlag = 0;//数据解析memset(uartBuf,0,uartBufIndex);uartBufIndex = 0;}
}void Timer1_Isr(void) interrupt 3
{if(uartFlag) uartTick++;
}

二、串口功能-查询设备状态

在这里插入图片描述

1.memcmpstrcmp

对比接收数据存放数组可以使用memcmp或者strcmp

  • int memcmp(const void *s1, const void *s2, size_t n)
    比较两个内存区域的前 n 个字节。

  • int strcmp(const char *s1, const char *s2)
    比较两个以\0 结尾的字符串,直到遇到第一个不匹配字符或结束符。

2.运动状态设计

定义idata u8 moveState;表示运动状态:
0-空闲 1-等待 2-运行
在这里插入图片描述

3.串口解析"?"

void uartProc()
{if(!uartBufIndex) return;if(uartTick >= 10){uartTick = uartFlag = 0;//串口解析if(strcmp(uartBuf, "?") == 0){if(!moveState)			//空闲状态printf("Idle");else if(moveState == 1) //等待状态printf("Wait");else					//运行状态printf("Busy");}memset(uartBuf,0,uartBufIndex);uartBufIndex = 0;}
}
  • 空闲状态
    在这里插入图片描述
  • 运行状态
    在这里插入图片描述

三、串口功能-查询设备位置

在这里插入图片描述
定义idata u16 currentPoint[2]表示当前位置坐标

void uartProc()
{if(!uartBufIndex) return;if(uartTick >= 10){uartTick = uartFlag = 0;if(strcmp(uartBuf, "?") == 0){if(!moveState)					//空闲状态printf("Idle");else if(moveState == 1) //等待状态printf("Wait");else									  //运行状态printf("Busy");}else if(strcmp(uartBuf, "#") == 0)printf("(%u,%u)",currentPoint[0],currentPoint[1]);memset(uartBuf,0,uartBufIndex);uartBufIndex = 0;}
}

在这里插入图片描述

四、串口功能-设置目的地坐标

在这里插入图片描述
接收坐标,例如(30,40)

数据数组位置uartBufIndex
(uartBuf[0]1
3uartBuf[1]2
0uartBuf[2]3
,uartBuf[3]4
4uartBuf[4]5
0uartBuf[5]6
)uartBuf[6]7
  • 所以判断两个括号只需判断uartBuf[0]uartBuf[uartBufIndex-1]是否为()即可。
  • 然后再将uartBuf[1]uartBuf[uartBufIndex-2]依次取出(用循环,每次循环取出一位),判断是否为数字(0~9),未碰到时,取出的数据是终点坐标的横坐标,用临时变量x保存,碰到,后,取出的数据是终点坐标的纵坐标,用临时变量y保存。
pdata u16 pointOver[2] = {0,0};  //终点坐标
idata bit dateFlag; //串口接收坐标标志位void uartProc()
{if(!uartBufIndex) return;if(uartTick >= 10){uartTick = uartFlag = 0;/*if(strcmp(uartBuf, "#") == 0)printf("(%u,%u)",currentPoint[0],currentPoint[1]);else if(strcmp(uartBuf, "?") == 0){if(!moveState)					//空闲状态printf("Idle");else if(moveState == 1) //等待状态printf("Wait");else									  //运行状态printf("Busy");}*/else if(uartBuf[0] == '(' && uartBuf[uartBufIndex-1] == ')'){idata u16 x = 0, y = 0;idata bit parse = 0; //解析标志位 0-解析x 1-解析yidata bit useful = 0;//收到的坐标是否有效 0-有效 1-无效idata u8 i;for(i = 1; i < uartBufIndex - 1; i++){u8 ch = uartBuf[i];if(ch >= '0' && ch <= '9')!parse ? (x = x * 10 + ch - '0') : (y = y * 10 + ch - '0');else if(ch == ',')parse = 1;else//接收到无效数据{useful = 1;//收到的坐标无效break;//直接退出循环}}if(!useful)//数据有效时才保存坐标{pointOver[0] = x;pointOver[1] = y;dateFlag = 1; //收到目的地坐标if(!moveState)printf("Got it");elseprintf("Busy");}}elseprintf("Error");memset(uartBuf,0,uartBufIndex);uartBufIndex = 0;}
}

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

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

相关文章

深入探索 51 单片机:从入门到实践的全面指南

深入探索 51 单片机&#xff1a;从入门到实践的全面指南 一、引言 在嵌入式系统发展的漫长历程中&#xff0c;51 单片机犹如一颗璀璨的明星&#xff0c;虽然诞生已有数十年&#xff0c;但至今仍在众多领域发挥着重要作用。它以结构简单、易于学习、成本低廉等优势&#xff0c…

GD32F470+CH395Q

第一步&#xff1a;资料下载 以太网协议栈芯片 CH395 - 南京沁恒微电子股份有限公司 第二步&#xff1a;准备工程 &#xff08;1&#xff09; 首先准备一个编译无报错、可以正常打印和延时的工程文件&#xff0c;官方例程采用STM32F1芯片&#xff0c;但本文采用GD32F470芯片 …

Linux 怎么使用局域网内电脑的网络访问外部

一次性 export http_proxy"http://192.168.0.188:7890" export https_proxy"http://192.168.0.188:7890"一直生效 写入 ~/.bashrc&#xff08;或 ~/.bash_profile&#xff09; nano ~/.bashrc加入这一行&#xff1a; export http_proxy"http://19…

Mysql进阶篇1_存储引擎、索引、SQL性能分析指令

文章目录 1.存储引擎InnoDBMyISAMMemory存储引擎选择和对比 2.索引索引结构索引分类索引语法索引使用&#xff08;建议看完第3节后观看&#xff09;&#xff01;&#xff01;&#xff01;mysql如何使用索引查询数据&#xff08;个人理解&#xff09; 3.SQL性能分析SQL执行频率慢…

LeetCode 热题 100 118. 杨辉三角

LeetCode 热题 100 | 118. 杨辉三角 大家好&#xff0c;今天我们来解决一道经典的算法题——杨辉三角。这道题在 LeetCode 上被标记为简单难度&#xff0c;要求生成杨辉三角的前 numRows 行。杨辉三角是一个经典的组合数学问题&#xff0c;每一行的数字都是其正上方和正左上方…

修改或禁用Cursor的全局搜索默认快捷键

在 Cursor 中&#xff0c;默认情况下 双击 Shift 会打开 全局搜索&#xff08;Quick Open&#xff09;&#xff0c;类似于 VS Code 的 CtrlP 功能。如果你想修改或禁用这个快捷键&#xff0c;可以按照以下步骤操作&#xff1a; 1. 打开快捷键设置 方法 1&#xff1a;按下 Ctrl…

HarmonyOS Device Connector(hdc)

它是为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在windows/linux/mac系统上与设备进行交互。 hdc分为三部分&#xff1a; client&#xff1a;运行在电脑端的进程&#xff0c;开发者在执行hdc命令时启动该进程&#xff0c;命令结束后进程退出。 server&…

开源PDF解析工具Marker深度解析

开源PDF解析工具Marker深度解析 检索增强生成&#xff08;RAG&#xff09;系统的第一步就是做 pdf 解析&#xff0c;从复杂多样的 pdf 中提取出干净准确的文本内容。现有的最优秀的开源工具有两个&#xff1a;Marker 和 MinerU。因为 Marker 是个人开发者做的&#xff0c;文档…

ARM子程序调用与返回

子程序&#xff08;也叫过程、函数、方法&#xff09;是一个能被调用和执行并返回到调用点那条指令的代码 段。 两个问题&#xff1a;如何将参数传递给子程序或从子程序中传递出来&#xff1f;怎么从子程序返回到调用点&#xff1f; 指令BSR Proc_A调用子程序Proc_A。 处理器将…

算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)

一、算力经济的历史脉络与范式转移 1.1 中心化算力市场的演进困境 传统算力市场以超算中心、云计算平台为核心载体&#xff0c;其运营模式呈现强中心化特征。中国移动构建的"四算融合"网络虽实现百万级服务器的智能调度&#xff0c;但动态资源分配仍受制于集中式控…

小结: 接口类型和路由优先级

网络接口类型 1. Bridge-if&#xff08;桥接接口&#xff09; 作用&#xff1a;用于桥接网络&#xff0c;将多个接口或VLAN连接为一个广播域&#xff0c;实现二层数据转发。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 将接口加入…

mysql一些事

一.联合查询/多表查询 联合查询关键在于笛卡尔积的过程 笛卡尔坐标积的排列组合 首先它会将两个表用排列组合的方式进行排列组合。 表一 表二 进行排列组合 我们发现它的行是 两个表的行相乘&#xff0c;列是两表的列相加。 我们所看到的数据有合理的也有不合理的我们接下…

【工具】Open WebUI:本地化部署的AI交互平台

文章目录 一、Open WebUI 简介二、核心功能详解1. 多模型与多模态支持2. 本地RAG与文档集成3. 开发与定制化能力4. 安全与权限管理5. 用户体验优化 三、安装与部署指南1. 快速安装方式2. 高级配置3. 常见问题 四、实际应用场景1. 个人隐私助手2. 企业知识库3. 学术研究4. 创意工…

AutoGPT

一、简介 是一个基于openAI研发的GPT4模型的一个开源应用程序&#xff0c;根据用户指定的目标&#xff0c;自动生成所需的提示&#xff0c;并且执行需要多个步骤才能完成的项目&#xff0c;整个过程不需要人类干预和指导&#xff08;无监督学习&#xff09;&#xff0c;生成式…

[C++] 小游戏 决战苍穹

大家好&#xff0c;各位看到这个标题&#xff0c;斗破苍穹什么时候改叫决战苍穹了&#xff1f;其实&#xff0c;因为版权等一系列问题&#xff0c;斗破苍穹正式改名为决战苍穹&#xff0c;这个版本主要更新内容为解决了皇冠竞技场太过影响游戏平衡&#xff0c;并且提高了一些装…

Spring的数据库编程

本内容采用最新SpringBoot3框架版本,视频观看地址:B站视频播放 1. JdbcTemplate概述 针对数据库操作,Spring框架提供了JdbcTemplate类,JdbcTemplate是一个模板类,Spring JDBC中的更高层次的抽象类均在JdbcTemplate模板类的基础上创建。 JdbcTemplate类提供了操作数据库…

Debezium MySqlValueConverters详解

Debezium MySqlValueConverters详解 1. 类的作用与功能 1.1 核心作用 MySqlValueConverters是Debezium中负责MySQL数据类型转换的核心类,主要功能包括: 数据类型映射:将MySQL的数据类型映射到Kafka Connect的Schema类型值转换:将MySQL的原始值转换为Kafka Connect可用的…

进程与线程:06 操作系统之“树”

操作系统核心知识回顾与思维训练 在之前的学习中&#xff0c;我们深入探讨了CPU管理相关内容。 CPU管理内容回顾&#xff1a;我们学习了CPU直观管理方法&#xff0c;了解如何让简单程序执行&#xff0c;分析了CPU效率低下的原因及处理办法&#xff0c;即实现多程序执行。接着…

Android Studio Profiler

1.我们想要查看自己方法的调用链&#xff0c;或者分析方法耗时的情况&#xff0c;可以选择Android Studio的Profiler&#xff0c;比较方便快捷。如下&#xff1a; 2.基本的面板参数讲解&#xff1a; 3.可以通过搜索&#xff0c;查看对应的方法&#xff0c;以及方法的调用链…

33、VS中提示“以下文件中的行尾不一致。是否将行尾标准化?“是什么意思?

在Visual Studio&#xff08;VS&#xff09;中遇到提示“以下文件中的行尾不一致。是否将行尾标准化&#xff1f;”时&#xff0c;意味着当前打开或正在编辑的文件内部存在行尾符&#xff08;EOL&#xff0c;End-Of-Line&#xff09;格式不统一的情况。以下是详细解释和应对建议…