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

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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值