陶晶驰HMI3.5寸串口屏的详解之梳理F4总结系列准备篇(二)

基于stm32的串口屏教程。用过的人都说好,哈哈哈,减少了我们很多不太必要的麻烦步骤。

  1. 程序资料包CSDN下载地址:https://download.csdn.net/download/qq_38351824/12111050
  2. 微信公众号下载地址:① 关注Tech云,回复 陶晶驰HMI3.5寸串口屏的详解  文章最后有下载链接

一、HIM串口屏(上位机端)

我们对以下几个常用的模块写一个专门的测试程序,也对HIM与stm32的通信函数进行了封装。

滑动文本控件:g0.txt="文本测试"
文本控件: t0.txt="测试成功ok" 
进度条控件:j0.val=90
滑块控件:h0.val=66
数字控件:n0.val=1236
单选框控件:r0.val=0
多选框控件:c0.val=1

二、HIM串口屏与STM32的通信函数:

(1)字符串接收函数:uint8_t Usart_Sum_rec( USART_TypeDef * pUSARTx, uint8_t * rev)

  • 返回值:1为获取数据成功   0为获取数据失败
  • USART_TypeDef * pUSARTx   选择串口输出,注意必须先初始化、使能该串口
  • uint8_t * rev  利用指针获取数据
//字符接收函数:
//uint8_t Usart_Sum_rec( USART_TypeDef * pUSARTx, uint8_t * rev)
//返回值:1为获取数据成功   0为获取数据失败
//USART_TypeDef * pUSARTx   选择串口输出,注意必须先初始化、使能该串口
//uint8_t * rev  利用指针获取数据
uint8_t Usart_Sum_rec( USART_TypeDef * pUSARTx, uint8_t * rev)
{
	 if(USART_GetFlagStatus(pUSARTx,USART_FLAG_RXNE)!=RESET)
	 {	
		 *rev = USART_ReceiveData(pUSARTx);
		 Delay_ms(1);
		 return 1;
	 }
	 return 0;
 }

(2)字符串发送函数:HMI_SendText(USART_TypeDef* USARTx,u8 *data,u8 len,u8 *text,u8 len2)

  • USART_TypeDef* USARTx: 选择串口输出,注意必须先初始化、使能该串口
  • char *data:上位机上文本位相应的改变数值代码,如"t0.txt="、"t1.txt="
  • u8 len:*data代码的长度。如"t0.txt="长度为7。
  • char *text:需要串口输出显示的文本
  • u8 len2:需要显示的文本的长度,英文一个字符一字节、汉字一个字两个字节    
//字符串发送函数:
//HMI_SendText(USART_TypeDef* USARTx,u8 *data,u8 len,u8 *text,u8 len2)
//USART_TypeDef* USARTx: 选择串口输出,注意必须先初始化、使能该串口
//char *data:上位机上文本位相应的改变数值代码,如"t0.txt="、"t1.txt="
//u8 len:*data代码的长度。如"t0.txt="长度为7。
//char *text:需要串口输出显示的文本
//u8 len2:需要显示的文本的长度,英文一个字符一字节、汉字一个字两个字节    

void HMI_SendText(USART_TypeDef* USARTx,char *data,u8 len,char *text,u8 len2)
{
	u8 t;
	for(t=0;t<len;t++)
	{	
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
		USART_SendData(USARTx,data[t]); 					
	}
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET) {;}       //双引号
	USART_SendData(USARTx,0X22); 
	for(t=0;t<len2;t++)	
	{
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
		USART_SendData(USARTx,text[t]); 
	}
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET){;}        //双引号
	USART_SendData(USARTx,0X22); 				
	for(int count=0;count<3;count++){
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
		USART_SendData(USARTx,0XFF);
	}
}

(3)数值发送函数:void HMI_SendNum(USART_TypeDef* USARTx,char *data,u8 len,u16 Num,u8 len2)

  • USART_TypeDef* USARTx: 选择串口输出,注意必须先初始化、使能串口
  • char *data:上位机上数字位相应的改变数值代码
  • u8 len:*data代码的长度。
  • u16 Num:需要显示的数值,注意开头0不显示
  • u8 len2:需要显示的数值的位数
//10的乘方函数,用于判断位数
u32 HMI_Pow(u8 n)
{
	u32 result=1;	 
	while(n--)result*=10;    
	return result;
}	


//数值发送函数
//USART_TypeDef* USARTx: 选择串口输出,注意必须先初始化、使能串口
//char *data:上位机上数字位相应的改变数值代码
//u8 len:*data代码的长度。
//u16 Num:需要显示的数值,注意开头0不显示
//u8 len2:需要显示的数值的位数
void HMI_SendNum(USART_TypeDef* USARTx,char *data,u8 len,u16 Num,u8 len2)
{
	u8 t;
	for(t=0;t<len;t++)
	{	
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
		USART_SendData(USARTx,data[t]); 					
	}
	for(t=0;t<len2;t++)	
	{
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
		USART_SendData(USARTx,'0'+(Num/HMI_Pow(len2-t-1))%10);   //转化为字符型+48
	}
	for(int count=0;count<3;count++){
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
		USART_SendData(USARTx,0XFF);
	}
}

三、HIM串口屏与stm32的通信测试程序:

void HMI_Test(void)
{
	uint8_t rev_num=0;               //接收数据使用
////////////////////////////////////////////////////////////////////
//////////////////////////////写入检测//////////////////////////////
////////////////////////////////////////////////////////////////////		
//滑动文本控件:g0.txt="文本测试"
	HMI_SendText(UART5,"g0.txt=",7,"文本测试",16);	
	Delay_ms(100);				
//文本控件: t0.txt="测试成功ok" 
	HMI_SendText(UART5,"t0.txt=",7,"测试成功ok",16);	
	Delay_ms(100);					
//进度条控件:j0.val=90
	HMI_SendNum(UART5,"j0.val=",7,90,4);
  Delay_ms(10);		
//滑块控件:h0.val=66
	HMI_SendNum(UART5,"h0.val=",7,66,4);
  Delay_ms(10);		
//数字控件:n0.val=1236
	HMI_SendNum(UART5,"n0.val=",7,1236,4);
  Delay_ms(10);
//单选框控件:r0.val=0
	HMI_SendNum(UART5,"r0.val=",7,0,4);
  Delay_ms(10);
//多选框控件:c0.val=1
 	HMI_SendNum(UART5,"c0.val=",7,1,4);
  Delay_ms(10);		

////////////////////////////////////////////////////////////////////
//////////////////////////////读取检测//////////////////////////////
////////////////////////////////////////////////////////////////////		   
	while(1)
		if(Usart_Sum_rec(UART5,&rev_num))   //如果接收到了数据
		{
			if(rev_num=='3'){                   //如果接收到了数据3
			
	    HMI_SendNum(UART5,"h0.val=",7,0,4);	 //滑块控件:h0.val=0
			Delay_ms(10);
			}				
		}	
}
发布了350 篇原创文章 · 获赞 684 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/qq_38351824/article/details/104027343
F4