进阶——第十六届蓝桥杯熟练度练习(串口)

server/2025/1/21 17:07:09/

USART是(通用同步异步收发器) UART是(通用异步收发器)

单片机作为主机发送数据到从机

代码包含
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */#include "lcd.h"#include "stdio.h"#include "string.h"
变量声明
 char tx_buf[20];
执行代码

有个很有意思的现象,在某些情况下,即使你包含了 <stdio.h>,也可能因为链接库的问题而出现找不到函数的情况。不过,对于标准 C 库函数,这种情况相对较少见,一般是在使用自定义库或某些嵌入式环境中可能会出现。

strlen函数注意要包含头文件“string.h”

  sprintf(tx_buf,"jin ke");HAL_UART_Transmit(&huart1,(uint8_t*)(tx_buf),strlen(tx_buf),50);

 单片机作为从机接受数据(单个字符)

 变量声明(为什么定义成uint8,还可以让他==o)

在 C 或 C++ 语言中,当使用 if (rx_data == 'c') 这样的表达式,其中 rx_data 被定义为 uint8_t(通常是 unsigned char 的别名),之所以可以与字符进行比较,是因为发生了隐式类型转换。

  1. 字符的存储本质:在计算机中,字符是以整数编码的形式存储的。常见的编码方式如 ASCII 编码,每个字符都对应一个唯一的整数值。例如,字符 'c' 在 ASCII 编码中对应的值是 99。
  2. 隐式类型转换:在 C 和 C++ 中,当进行比较操作时,如果比较双方的类型不同,会发生隐式类型转换。在 if (rx_data == 'c') 这个表达式中,字符 'c' 会被隐式转换为 uint8_t 类型(因为 rx_data 是 uint8_t 类型),然后再进行比较。这个转换过程遵循 C 和 C++ 的类型转换规则,将字符对应的整数值(99)转换为 uint8_t 类型的值(如果 99 在 uint8_t 能表示的范围内,即 0 到 255,转换后值不变),然后与 rx_data 中的值进行比较。
 uint8_t rx_data;
 开启中断
  HAL_UART_Receive_IT(&huart1,&rx_data,1);
中断执行函数(不用声明)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(rx_data=='o')
{led_show(0x02);sprintf(tx_buf,"open ok");HAL_UART_Transmit(&huart1,(uint8_t*)(tx_buf),strlen(tx_buf),50);
}
if(rx_data=='c')
{
led_show(0x02^0x02);sprintf(tx_buf,"close ok");HAL_UART_Transmit(&huart1,(uint8_t*)(tx_buf),strlen(tx_buf),50);
}HAL_UART_Receive_IT(&huart1,&rx_data,1);}

 单片机作为从机接受数据(多个字符)

 变量声明
 char tx_buf[20];char rx_buf[20];uint8_t rx_count;uint8_t rx_data;
中断执行函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{rx_buf[rx_count++]=rx_data;HAL_UART_Receive_IT(&huart1,&rx_data,1);}
接受字符串函数
两个新的函数strcmp与memset
  • strcmp 函数比较两个字符串 str1 和 str2,并根据比较结果返回一个整数:
    • 如果 str1 小于 str2,返回一个小于 0 的整数(通常是 -1)。
    • 如果 str1 等于 str2,返回 0。
    • 如果 str1 大于 str2,返回一个大于 0 的整数(通常是 1)。
    • #include <string.h>
      void *memset(void *ptr, int value, size_t num);
    • memset 函数将 ptr 所指向的内存块的前 num 个字节的值设置为 value
    • 它通常用于初始化内存块,将其填充为特定的值,例如将数组元素初始化为 0 或其他常数值。
void uart_proc(void)
{
if(rx_count==4)
{
if(strcmp(rx_buf,"LEDO")==0)
{
led_show(0x08);}
if(strcmp(rx_buf,"LEDC")==0)
{
led_show(0x08^0x08);
}
rx_count=0;
memset(rx_buf,0,20);
}
}


http://www.ppmy.cn/server/160237.html

相关文章

Android Http基础:图片下载并显示和WebView的应用

<RelativeLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingLeft"dimen/ac…

cmake 可使用的构建系统

cmake 可使用的构建系统 ChatGPT 说&#xff1a; ChatGPT CMake 支持多种构建系统&#xff0c;允许用户根据其开发环境选择适合的构建工具。以下是 CMake 常用的构建系统和生成器&#xff1a; 1. Visual Studio 系列 适用于 Windows 环境的 Visual Studio 构建系统&#xf…

PyTest自学-认识PyTest

1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么&#xff1f; PyTest是一个自动化测试框架&#xff0c;支持单元测试和功能测试&#xff0c;有丰富的插件&#xff0c;如&#xff0c;pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…

Node.js 到底是什么

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者使用 JavaScript 编写服务器端代码。 一、主要特点 1. 事件驱动和非阻塞 I/O 模型 Node.js 采用事件驱动架构&#xff0c;通过回调函数处理 I/O 操作&#xff0c;这使得它在处理大量并发请…

【正点原子STM32精英V2开发板体验】体验LVGL的SD NAND文件系统

目的 验证基于SD NAND卡在正点原子STM32精英V2开发板上的兼容效果 实验材料 正点原子STM32精英V2开发板 TF 卡一片 SD NAND卡一片 实验步骤 1、打开例程【正点原子】精英STM32F103开发板 V2-资料盘(A盘)\4&#xff0c;程序源码\3&#xff0c;扩展例程\4&#xff0c;LVGL…

无数据库开源Wiki引擎WikiDocs

简介 什么是 WikiDocs &#xff1f; WikiDocs 是一个无数据库的开源 Markdown 文件平面 Wiki 引擎。它旨在提供一个简单、灵活且易于使用的 Wiki 解决方案&#xff0c;允许用户创建和管理文档而无需依赖传统数据库。 主要特点 无数据库&#xff1a;使用纯文本文件存储数据&am…

AI 之网:网络诈骗者的 “高科技伪装术”—— 智能诈骗的神秘面纱

本篇文章博主将以AI的反面应用为例&#xff1b;配合代码辅助说明&#xff1b;带大家了解背后的“黑面纱”&#xff1b;也同时希望大家能够正反结合&#xff1b;不要误入歧途。 &#xff1a;羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的…

RabbitMQ---应用问题

&#xff08;一&#xff09;幂等性介绍 幂等性是本身是数学中的运算性质&#xff0c;他们可以被多次应用&#xff0c;但是不会改变初始应用的结果 1.应用程序的幂等性介绍 包括很多&#xff0c;有数据库幂等性&#xff0c;接口幂等性以及网络通信幂等性等 就比如数据库的sel…