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

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

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

相关文章:

  • Spring Security @PreAuthorize @PostAuthorize 权限控制
  • C语言 | Leetcode C语言题解之第542题01矩阵
  • 【每日刷题】Day151
  • PHP API接口采用什么通信协议
  • 将vscode的终端改为cygwin terminal
  • lua入门教程:垃圾回收
  • adb shell常用命令
  • LocalDate日期加减一天,mysql日期加减一天
  • K8s使用nfs
  • playground.tensorflow神经网络可视化工具
  • Python 5个数据容器
  • nodeJS程序如何引入依赖包
  • Fortran安装(vscode+gcc+Python)
  • github和Visual Studio
  • Python并发编程库:Asyncio的异步编程实战
  • 智慧城市智慧城市项目方案-大数据平台建设技术方案(原件Word)
  • 如何学习Java“高并发”,并在项目中实际应用?
  • uniapp(API-Promise 化)
  • 华为云前台网络是如何使用,功能有哪些?
  • 发现个免费建站免费体验模板使用的地方(腾讯云上)
  • DQN详解
  • 分享大模型发展进入新阶段,产业应用成为竞争焦点
  • 80后聊架构:架构设计中两个重要指标,延时与吞吐量(Latency vs Throughput) | 架构师之路...
  • Java链表及源码解析
  • 鸿蒙next选择 Flutter 开发跨平台应用的原因
  • 探索 Java 中 String 类的常用方法