UART串口通信

STM32CubeMX配置

之后打开中断

实验代码

 
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "Led.h"
#include "lcd.h"
#include "stdio.h"
#include "Interrupt.h"
#include "AAdc.h"
#include "i2c_hal.h"
#include "string.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

extern struct Keys key[]; 				//可以在main函数中直接操作这个变量(在Interrupt.c中的)
extern uint Frq1,Frq2;

extern char RxData[30];
extern uint8_t RxDat;		
extern uchar Rx_Pointer;	//进行到哪一步了

uchar view = 0;		//界面显示标志
uchar PA6_Duty = 10;  	//PA6的占空比
uchar PA7_Duty = 10;		//PA7的占空比

//可以改成结构体
char car_type[5];
char car_data[5];
char car_time[13];

void Key_proc(void);
void Disp_proc(void);
void Uart_Rx_Proc(void);

 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	Key_proc();
	Disp_proc();
	if(Rx_Pointer != 0)
	{
		int temp = Rx_Pointer;
		HAL_Delay(1);
		if(temp == Rx_Pointer){Uart_Rx_Proc();}
	}																//防止接收不完整的情况
	
//串口发送
//	  char temp[20];
//	  sprintf(temp, "Frq = %d\r\n", Frq1);
//	  HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp), 50);	//函数作用:串口发送一个数据
	  
	  
  }

void Key_proc(void)
{
	if(key[0].Single_Flag == 1)
	{
		view++;
		if(view==3){view = 0;}
		LCD_Clear(Black);
		
		key[0].Single_Flag = 0;	
	}
	if(key[1].Single_Flag == 1)
	{
		PA6_Duty+=10;
		if(PA6_Duty>=100)PA6_Duty=10;
		__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,PA6_Duty);//将特定定时器占空比设为PA6_Duty的数值
		key[1].Single_Flag = 0;
	}
	if(key[2].Single_Flag == 1)
	{
		PA7_Duty+=10;
		if(PA7_Duty>=100)PA7_Duty=10;
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,PA7_Duty);//将特定定时器占空比设为PA7_Duty的数值
		key[2].Single_Flag = 0;	
	}
	if(key[3].Single_Flag == 1)
	{
		uchar Frq_h = Frq1>>8;
		uchar Frq_l = Frq1&0xFF;
		eeprom_write(1, Frq_h);
		HAL_Delay(10);
		eeprom_write(2, Frq_l);
		key[3].Single_Flag = 0;	
	}
}
void Disp_proc(void)
{
	if(view == 0)
	{
		char text[30];
		sprintf(text,"       Data         ");
		LCD_DisplayStringLine(Line0, (uint8_t *)text);
		sprintf(text,"     FRQ1=%dHz      ",Frq1);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     FRQ2=%dHz      ",Frq2);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
		sprintf(text,"     V=%.2f      ",GetADC(&hadc1));
		LCD_DisplayStringLine(Line6, (uint8_t *)text);
		sprintf(text,"     V=%.2f      ",GetADC(&hadc2));
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
		
		uint eep_temp = (eeprom_read(1)<<8) + eeprom_read(2);
		
		sprintf(text,"     FRQ_eep=%d  ",eep_temp);
		LCD_DisplayStringLine(Line8, (uint8_t *)text);

	}
	if(view == 1)
	{
		char text[30];
		sprintf(text,"       Para         ");
		LCD_DisplayStringLine(Line0, (uint8_t *)text);
		sprintf(text,"     PA6:%d%%       ",PA6_Duty);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     PA7:%d%%       ",PA7_Duty);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
	}

	if(view == 2)
	{
		char text[30];
		sprintf(text,"       Car         ");
		LCD_DisplayStringLine(Line0, (uint8_t *)text);
		sprintf(text,"    Car_type:%s    ",car_type);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"    Car_data:%s    ",car_data);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		sprintf(text,"    Car_time:%s    ",car_time);
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
	}
}

void Uart_Rx_Proc(void)
{
	if(Rx_Pointer > 0)
	{
		if(Rx_Pointer == 22)
		{
			sscanf(RxData,"%4s:%4s:%12s", car_type, car_data, car_time); 
			//作用:把RxData分为3部分将4位放入car_type中
			
		}else
		{
			char temp[5];
			sprintf(temp, "Error");
			HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp), 50);
		}
		Rx_Pointer = 0; memset(RxData, 0, 30);
		
	}
	
	
}

 

没了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值