当前位置: 首页 > article >正文

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

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.kler.cn/a/511056.html

相关文章:

  • React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目
  • C#中System.Text.Json:从入门到精通的实用指南
  • 嵌入式硬件篇---PID控制
  • 第5章:Python TDD定义Dollar对象相等性
  • 三电平空间矢量详解
  • 论文阅读:CosAE Learnable Fourier Series for Image Restoration
  • rook-ceph云原生存储解决方案
  • 洗衣店订单|基于springboot+vue的洗衣店订单管理系统(源码+数据库+文档)
  • 【博客之星评选】2024年度前端学习总结
  • HTML练习-校园官网首页面
  • 医院管理系统小程序设计与实现(LW+源码+讲解)
  • 一文大白话讲清楚Node中间件
  • WPS数据分析000004
  • redis-排查命中率降低问题
  • 判断nginx的请求是否存在堆积
  • 深度学习基础--LSTM学习笔记(李沐《动手学习深度学习》)
  • JWT在线解密/JWT在线解码 - 加菲工具
  • 3.2 OpenAI 语言模型总览:GPT 系列的演进与应用解析
  • 精准测量,尽在掌握 —— 电导率传感器:科技之水质的守护者
  • ubuntu支持中文的字体
  • 【PowerQuery专栏】PowerQuery提取XML数据
  • Golang——常用库reflect和unsafe
  • 实施工程师:面试基础宝典
  • 【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-dio版本(31 /100)
  • QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能
  • ASP.NET Core--依赖注入(DI)--在ASP.NET Core中使用依赖注入