2024.11.4 STM32点灯和简单的数据收发

news/2024/11/8 17:39:20 标签: 单片机, 嵌入式硬件

1.发送函数

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

参数1: UART 处理结构体的指针,该结构体包含了 UART 的所有配置参数。

参数2:要发送的数据指针

参数3:要发送的数据长度(单位:字节)

参数4:超时时间 (单位ms,如果在该时间内没有完成,则直接执行下一条语句,并且返回HAL_timeout)

返回值:

  • HAL_OK: 操作成功。
  • HAL_ERROR: 发生错误

2.接收函数

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

参数:

参数1: UART 处理结构体的指针,该结构体包含了 UART 的所有配置参数。

参数2:要接收数据的变量指针

参数3:要接收的数据长度(单位:字节)

参数4:超时时间 (单位ms,如果在该时间内没有完成,则直接执行下一条语句)

返回值:

  • HAL_OK: 操作成功。
  • HAL_ERROR: 发生错误

以上是HAL库进行数据收发的函数,不过一般使用printf和scanf。因为printf和scanf会调用fputc和fgetc,因此重写fputc和fgetc执行数据收发。在重写之后就可以直接使用printf和scanf函数进行数据的收发。

fgetc重写1:


int fputc(int ch,FILE *f){
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,10);
    return ch;
}

fputc重写2:

int fputc(int ch,FILE *f){

        while(!(USART1->ISR&(1<<7)));

USART1->TDR=ch;

return ch;

}

fgetc的重写:

int fgetc(FILE *f){
    uint8_t ch;
    while(!(USART1->ISR&(1<<5)));
    ch=USART1->RDR;
    return ch;
}

因为scanf会自动在字符串末尾加上\0(win为\r),因此相较于Hal原生函数,scanf不需要对其他进行关心。

1.当STM32接收到串口助手的命令后,控制马达震动,表示有数据接收

	scanf("%s",buffer);
		if(!strcmp(buffer,"motor")){
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,1);
	//			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,1);
		}else{
			printf("not motor code");
		}

2.当STM32收到LED1_ON时,打开LED1收到LED1_OFF时,关闭LED1

scanf("%s",buffer);
		if(!strcmp(buffer,"LED1_ON")){
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,1);
		}else if(!strcmp(buffer,"LED1_OFF")){
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,0);
		}else{
			printf("not led1 code");
		}

3.当STM32收到LED3_ON时,打开LED3 收到LED3_OFF时,打开LED3

scanf("%s",buffer);
		if(!strcmp(buffer,"LED3_ON")){
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,1);
		}else if(!strcmp(buffer,"LED3_OFF")){
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,0);
		}else{
			printf("not led3 code");
		}


4.当STM32收到STATUS时:将LED1 LED3光电开关的状态,推送到串口助手中
 

	if(!strcmp("STATUS",buffer)){
			int a=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4);
			int b=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);
			printf("led1 status :%d",a);
			printf("led3 status :%d",b);
		}else{
			printf("not status code");
		}


http://www.niftyadmin.cn/n/5744228.html

相关文章

计算机视觉基础:OpenCV库详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机视觉基础&#xff1a;OpenCV库详解 计算机视觉基础&#xff1a;OpenCV库详解 计算机视觉基础&#xff1a;OpenCV库详解 引…

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐&#xff1b; 什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&…

第一个纯血鸿蒙应用(Napi开发-ArtTS调用C/C++)

1.行业背景 纯血鸿蒙&#xff0c;即鸿蒙Next版已于2014年1月正式发版&#xff0c;鸿蒙生态设备数量已经突破10亿台&#xff0c;已经有超过15000个应用和元服务上架。鸿蒙生态不只是移动设备这么简单&#xff0c;他打造的是一个18n的全场景战略&#xff0c;真正做到了“万物互联…

k8s 上如何跑 Dolphins 模型

接着上一篇的介绍&#xff0c;这一篇就来跑跑 Dolphins 模型&#xff0c;本篇会记录&#xff0c;跑模型常见的阬点。 1 在 k8s 上创建 pod 将外部数据挂载在 pod 里&#xff0c;并申请 gpu 资源。同时修改代码里对应的引入数据的路径 # dolphins.yaml apiVersion: v1 kind: …

Webpack知识点—publicPath

文章目录 一、publicPath的定义和作用二、publicPath的配置方式三、publicPath的注意事项四、publicPath的常见问题和解决方法五、Vite 如何修改publicPathWebpack的publicPath是一个重要的配置项,它用于指定打包后生成的静态资源文件在浏览器中的访问路径。 一、publicPath的…

【计算机网络】章节 知识点总结

一、计算机网络概述 1. 计算机网络向用户提供的两个最重要的功能&#xff1a;连通性、共享 2. 因特网发展的三个阶段&#xff1a; 第一阶段&#xff1a;从单个网络 ARPANET 向互联网发展的过程。1983 年 TCP/IP 协议成为 ARPANET 上的标准协议。第二阶段&#xff1a;建成三级…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来&#xff0c;勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷&#xff0c;勒索攻击形势愈发严峻&#xff0c;已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今&#xff0c;勒索攻击手段日趋成熟、攻击目标愈发明确&#xff0c;模式…

针对曲率中的局部抖动进行平滑

在计算曲率的过程中&#xff0c;采用平滑函数确实能够有效降低数据的抖动现象。然而&#xff0c;若对整个数据集实施平滑处理&#xff0c;则可能会引发数据失真的问题。 为了最大程度地减少抖动并尽可能确保曲率计算的准确性&#xff0c;我们应当仅针对曲率中的局部抖动进行平…