欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 蓝桥杯嵌入式入门指南-UART【7】

蓝桥杯嵌入式入门指南-UART【7】

2024/12/26 19:18:48 来源:https://blog.csdn.net/m0_47282648/article/details/144149943  浏览:    关键词:蓝桥杯嵌入式入门指南-UART【7】

在这里插入图片描述
在all.c定义缓存变量

char uart_tx[50];//uart缓冲区
char uart_rx[50];//uart缓冲区

USRT发送(使用strlen时需要在all.h添加string.h)

	sprintf(uart_tx ,"  PB15:%.4f V  \r\n  ",adc_data_PB15);HAL_UART_Transmit(&huart1,(uint8_t *)uart_tx,strlen(uart_tx),50);//串口名字 数据 长度 发送间隔

UART接收(接收时需要在setup()中打开)

	HAL_UARTEx_ReceiveToIdle_IT(&huart1 ,(uint8_t *)uart_rx,50);//用一次关一次,需要重新打开

当收到串口收到hello,屏幕打印"World!"

//UART接受
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)//串口接收到数据后就会产生一个回调
{char recieve[5];//定义接收数据大小char key[5]="hello";sscanf(uart_rx,"%s",recieve);//扫描接收数据if(strcmp(recieve,key) == 0)//对比数据是否为hello{sprintf(text,"  World!    ");LCD_DisplayStringLine(Line6,(uint8_t *)text);}HAL_UARTEx_ReceiveToIdle_IT(&huart1 ,(uint8_t *)uart_rx ,50);//用一次关一次,需要重新打开
}

全部代码

#include "all.h"uint8_t led_sta=0x20;//LED初始化参数
extern struct Bkeys bkey[];//按键存储
char  text[30]; //存放显示文本
char uart_tx[50];//uart发送缓冲区
char uart_rx[50];//uart接受缓冲区void LED_Disp(uint8_t dsLED)//LED控制
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位。控制C8~C15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void LED_Chg(uint8_t num,uint8_t sta)//单独控制一个LED
{uint8_t pos = 0x01<<(num-1);led_sta =(led_sta&(~pos))|(pos*sta);LED_Disp(led_sta);
}float adc_read(ADC_HandleTypeDef *hadc)
{uint16_t adc_val;float adc_f;HAL_ADC_Start (hadc);adc_val = HAL_ADC_GetValue(hadc);adc_f = adc_val*3.3f/4096.0f;return adc_f;
}void setup()
{HAL_TIM_Base_Start_IT(&htim6);//开启TIMHAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//产生PWMHAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);//打开pwm捕获HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);//打开pwm捕获HAL_ADCEx_Calibration_Start(&hadc2 ,ADC_SINGLE_ENDED);//ADC自动校准HAL_UARTEx_ReceiveToIdle_IT(&huart1 ,(uint8_t *)uart_rx,50);//用一次关一次,需要重新打开//LED初始状态LED_Disp(0x00);//LCD初始化LCD_Init();LCD_Clear(Black );LCD_SetBackColor(Black);LCD_SetTextColor(White);
}void loop()
{//PWM捕获float frq1 = 0;float duty1 = 0;frq1 = 1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);//获取频率duty1 = ((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1));//获取占空比sprintf(text,"     FQR:%.2f Hz     ",frq1);LCD_DisplayStringLine(Line2,(uint8_t *)text);sprintf(text,"     DUTY:%.2f %%     ",duty1);LCD_DisplayStringLine(Line3,(uint8_t *)text);//ADCfloat adc_data_PB15;adc_data_PB15 = adc_read(&hadc2);sprintf(text,"  PB15:%.4f V    ",adc_data_PB15);LCD_DisplayStringLine(Line4,(uint8_t *)text);//	//UART发送
//	sprintf(uart_tx ,"  PB15:%.4f V  \r\n  ",adc_data_PB15);
//	HAL_UART_Transmit(&huart1,(uint8_t *)uart_tx,strlen(uart_tx),500);//串口名字 数据 长度 发送间隔if(bkey[1].short_flag==1){LED_Chg(1,1);sprintf(text,"        down!        ");LCD_DisplayStringLine(Line1,(uint8_t *)text);bkey[1].short_flag = 0;}if(bkey[1].long_flag==1){LED_Chg(2,1);sprintf(text,"      long_down!      ");LCD_DisplayStringLine(Line1,(uint8_t *)text);}}//UART接受
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)//串口接收到数据后就会产生一个回调
{char recieve[5];//定义接收数据大小char key[5]="hello";sscanf(uart_rx,"%s",recieve);//扫描接收数据if(strcmp(recieve,key) == 0)//对比数据是否为hello{sprintf(text,"  World!    ");LCD_DisplayStringLine(Line6,(uint8_t *)text);}HAL_UARTEx_ReceiveToIdle_IT(&huart1 ,(uint8_t *)uart_rx ,50);//用一次关一次,需要重新打开
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//按键服务
{if(htim->Instance == TIM6)key_serv();}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com