首页 > 其他分享 >蓝桥杯-STM32G431RBT6(串口)

蓝桥杯-STM32G431RBT6(串口)

时间:2024-09-17 17:21:43浏览次数:13  
标签:HAL tx UART rx STM32G431RBT6 蓝桥 串口 buf

前言

一、配置

二、使用步骤

1.串口发送

代码逻辑

效果展示

2.串口接收单个字符

代码逻辑

中断回调函数

3.串口接受字符串

代码逻辑

字符串函数

中断回调函数

声明

代码开源


前言

一、配置

二、使用步骤

1.串口发送

代码逻辑
  1. sprintf(tx_buf,"jin ke\r\n"):这行代码使用 sprintf 函数将字符串 "jin ke\r\n" 写入到 tx_buf 缓冲区中。
  2. HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50):这行代码使用 HAL_UART_Transmit 函数通过 huart1 串口发送 tx_buf 缓冲区中的数据。发送的数据长度是通过 strlen(tx_buf) 计算得到的,并且设置了一个超时时间为 50 毫秒。
  3. &huart1 是指向 huart1 这个结构体的指针。huart1 通常是一个串口通信相关的结构体,通过这个指针可以访问和操作与该串口相关的配置和功能

  4. 将 tx_buf 强制转换为 (uint8_t*) 是为了确保将缓冲区中的数据以字节数组的形式传递给 HAL_UART_Transmit 函数。在 C 语言中,很多函数需要以特定的数据类型来接收参数,通过这种强制转换可以满足函数的要求,以便正确地进行数据传输操作。

char tx_buf[20];

 LCD_Init();
    LCD_Clear(White);
    LCD_SetBackColor(White);
	LCD_SetTextColor(Black);
	sprintf(tx_buf,"jin ke\r\n");
	HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);

将字符串写入缓冲区主要有以下几个原因:

  1. 提高效率:一次性将数据准备好放入缓冲区,然后统一进行发送,可以减少频繁的操作和中断,提高数据传输的效率。
  2. 便于管理:将数据集中在缓冲区中,方便对数据进行进一步的处理或操作,比如在发送之前可以根据需要对缓冲区中的数据进行修改。
  3. 连贯性:确保数据的连贯性和完整性,避免在逐字节发送过程中出现数据丢失或不完整的情况。
效果展示

2.串口接收单个字符

案例:接受到O时,点亮LED1并发送LED1OPEN!,接受到C时,熄灭LED1并发LED1CLOSE!

代码逻辑

HAL_UART_RxCpltCallback 是一个串口接收完成的回调函数。当串口接收到数据完成时,会调用这个函数来处理接收到的数据。在这个函数中,可以根据接收到的数据进行各种相应的操作,如控制其他设备、更新状态等。

  uint8_t rx_data;
中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(rx_data=='O')
	{led_show(2,1);
	sprintf(tx_buf,"led1OPEN!");
	HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
	}
	if(rx_data=='C')
	{led_show(2,0);
	sprintf(tx_buf,"led1CLOSE!");
	HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);	
	}
	HAL_UART_Receive_IT(&huart1,&rx_data,1);
}

3.串口接受字符串

代码逻辑
  •  uart_proc 函数用于处理串口数据。
    • 当 rx_count 等于 4 时,进行数据的比较和相应操作。
    • 通过 strcmp 函数比较接收到的 rx_buf 与特定字符串(如 "LEDO" 和 "LEDC")是否相等。
    • 根据比较结果控制 led 的显示状态,并发送相应的消息。
    • 最后将 rx_count 清零,清空 rx_buf 并重置其内容。
    • memset 是一个 C 语言标准库函数,用于将一段内存区域设置为指定的值。
    • 它的函数原型一般为 void *memset(void *str, int c, size_t n),其中:

    • str:指向要填充的内存块。
    • c:要设置的值(通常是一个字符)。
    • n:要设置的字节数。在上述代码中,memset(rx_buf, 0, 20) 是将 rx_buf 这个内存区域的前 20 个字节全部设置为 0,起到清空的作用。
    • strcmp 函数用于比较两个字符串。

    • 它的工作原理是逐个字符地比较两个字符串,直到遇到不同的字符或到达字符串的末尾。

    • 如果两个字符串完全相同,则返回 0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。

    • 在代码中,通过 strcmp 函数来比较接收到的 rx_buf 和特定的字符串,以确定执行相应的操作

字符串函数
void uart_proc(void)
{
if(rx_count==4)
{
	if(strcmp(rx_buf,"LEDO")==0)
	{
	led_show(1,1);
	sprintf(tx_buf,"led1OPEN!\r\n");
    HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
	}	
	if(strcmp(rx_buf,"LEDC")==0)
	{
	led_show(1,0);
	sprintf(tx_buf,"led1CLOSE!\r\n");
    HAL_UART_Transmit(&huart1,(uint8_t*)tx_buf,strlen(tx_buf),50);
	}
	rx_count=0;
	memset(rx_buf,0,20);
}
}
中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	rx_buf[rx_count++]=rx_data;
	HAL_UART_Receive_IT(&huart1,&rx_data,1);
}
声明
/* USER CODE BEGIN PV */
 uint8_t key_rval;
 char tx_buf[20];
 uint8_t rx_data;
 char rx_buf[20];
 uint8_t rx_count;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void uart_proc(void);
/* USER CODE END PFP */

代码开源

通过网盘分享的文件:12-TEST6-串口通信(接收和发送多个字符).zip
链接: https://pan.baidu.com/s/1IoKdqO9sgooXArpK1wgjyg?pwd=0820 提取码: 0820

标签:HAL,tx,UART,rx,STM32G431RBT6,蓝桥,串口,buf
From: https://blog.csdn.net/JK03820/article/details/142308803

相关文章

  • 蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
    新建工程教程见http://t.csdnimg.cn/JySLg点亮LED教程见http://t.csdnimg.cn/Urlj5末尾含所有代码目录按键原理图一、按键使用需要解决的问题1.抖动   1.什么是抖动   2.抖动类型   3.如何去消除抖动FIRST.延时函数消抖(缺点:浪费CPU资源)SECOND.中......
  • printk 串口打印级别
    打印级别格式:printk(KERN_EMERG"1111111KERN_EMERG\n");printk("<0>1111111KERN_EMERG\n");*******************************************************************************1.基本解决方法(如果这种方法不行,结尾处说明另一种小众原因)用到的命令1>cat/proc/sy......
  • Verilog - 串口命令封装(多个命令封装为1个命令)代码
    串口命令封装,代码实现思想:1.对接收的串口数据(8bit)进行移位2.识别封装命令,输出配置使能信号3.计数(计数器cnt),使计数时间大于一个命令的配置时间,当达到计数值cnt_x时,输出有效信号并对计数器清零4.输出flag信号:开始配置时,将flag信号拉高,配置完成后拉低5.计数(计数器cnt_ca......
  • 使用 csharp获取串口 的 全称
    使用的命名控件usingSystem.Management;代码点击查看代码///<summary>///获取串口的全称///</summary>///<returns></returns>publicstaticList<string>GetCompleteNameOfSerialPort(){List<string>serial_port_result=newList&......
  • 第十一届蓝桥杯单片机省赛试题
    第十一届预赛试题目录第十一届预赛试题一、系统硬件框图二、基本功能三、显示功能(1)数据界面(2)参数界面(3)计数界面0三、按键功能四、LED指示功能五、初始状态说明六、代码示例一、系统硬件框图二、基本功能(1)使用PCF8591芯片测量AIN3通道上获取的电......
  • 串口通信-stm32
    【实验目的】深入理解串口协议和串口程序编制方法;【实验要求】1.学会编写串口通信程序2.能够使用按键控制通信消息的发送2.学会在两块开发板之间通信的方式【实验内容】1.将开发板和PC机串口连接,并通过串口线和另一块开发板连接;2.在发送开发板上按下发送键,则向目标开发......
  • 蓝桥杯-基于STM32G432RBT6的LCD进阶(LCD界面切换以及高亮显示界面)
    目录一、页面切换内容详解1.逻辑解释2.代码详解code.c(内含详细讲解)code.hmain.c3.效果图片展示​编辑二、页面选项高亮内容详解1.逻辑解释2.读入数据FIRST.第一种高亮类型code.c(内含代码详解)code.hmain.cSECOND.第二种高亮类型3.效果展示开源代码一、页......
  • bfs与dfs ,全球变暖——蓝桥problems178
    问题描述:........##.....##........##...####....###........有一张还以N*N的像素照片,“.”表示海洋,“#”表示陆地,其中上下左右能连在一起的陆地称作岛屿,例如上图有两座岛屿,由于全球气候变暖,靠经海洋的陆地会被淹没,问图中有多少座岛屿会被完全淹没..........................
  • lesson05-设计主函数实现串口的初始化和运行
    根据boot.S里的内容,最后会跳转到kernel_main里,在这里会进行设置gpio引脚配置串口的初始化,然后循环运行,不断打印接受到的内容。//主函数voidkernel_main(){//串口初始化uart_init();//串口发送helloworlduart_send_string("Helloword!\n")//循环发......
  • 蓝桥杯【物联网】零基础到国奖之路:六. 中断
    蓝桥杯【物联网】零基础到国奖之路:六.中断第一节中断理论1,中断的作用2,中断和异常3,NVIC中断控制器4,中断的分类5,中断管理机制第二节GPIO中断1,CubeMX配置2,添加中断代码第一节中断理论举个例子:工作时电话响了,这时你会把手里的工作停下来,然后接电话,电话里的人安排你......