stm32-esp8266-emqx-wpf实现

系列文章目录

STM32-ESP8266-EMQX-WPF方案实现之STM32采集数据和串口收发



前言

通过STM32采集数据,ESP8266连接热点发送数据到云服务器EMQX,EMQX转发给WPF应用程序的方案

此文章是通过STM32采集流量传感器YF-S201数据和发送数据到ESP8266。主要内容就是定时器TIM2捕捉脉冲和串口发送、中断接收的内容。


一、TIM2定时器设置

选择的是YF-S201传感器,需要注意:

  1. 红正黑负,黄色信号线
  2. 工作电压5-18V
  3. 水压1.75Mpa以下
  4. NPN脉冲信号
  5. 流速:
    如1L/min的流速,脉冲个数为7.5160个
    1L/s的流速,脉冲为7.5个
    求每秒流速即每秒脉冲差值/7.5
    求每分钟的流速即每秒脉冲差值*60/450(即/7.5)

STM32CubeMX软件的设置:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

选择TIM2的工作模式、时钟来源等,其中PA0决定接收上升沿脉冲,于是选择了下拉输入。

二、串口发送、中断接收的设置

在这里插入图片描述

在这里插入图片描述

设置串口1,2的波特率为115200,异步串口通信,勾选中断。

三、具体逻辑实现与数据发送

1.TIM2定时器代码

代码如下:
main函数内

HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_1);
__HAL_TIM_SET_COUNTER(&htim2, 0);//脉冲计数初始值置为0

while函数内,获取当前计数值,NewWaterPulseNum 是一个整数型

NewWaterPulseNum = __HAL_TIM_GET_COUNTER(&htim2);

2.串口发送和中断接收的代码

main.c内的串口中断回调函数,用每次的换行符和回车符作为接收开启和结束的判断

/*main.c开头定义的变量
uint8_t Usart1_RxBuff[512]={0};//串口1接收数据
uint8_t Usart1_TxBuff[512]={0};//串口1发送数据
uint8_t ch1;//定义串口1接收缓存
int Usart1_RxNum=0;//定义串口1接收缓冲计数
int	Usart1_RxFlag=1;//定义串口1接收状态标志位,1表示接收状态为完成

uint8_t Usart2_RxBuff[512];//串口2接收数据
uint8_t Usart2_TxBuff[512];//串口2发送数据
uint8_t ch2;//定义串口2接收缓存
int Usart2_RxNum=0;//定义串口2接收缓冲计数
int	Usart2_RxFlag=1;//定义串口2接收状态标志位,1表示接收状态为完成
*/


/*中断回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	/*串口1中断函数*/
  if (huart->Instance == USART1) // ???????????? USART1
		{  
				//判断是否是串口1的中断
				Usart1_RxBuff[Usart1_RxNum] = ch1;          //把串口接收的数据的数据写入
				Usart1_RxNum++;
				if(ch1 == 0x0a)
					{   //判断结束符(0x0d \r回车,0x0a \n换行符)	
						for(int t=Usart1_RxNum;t<512;t++)
							{ 
									Usart1_RxBuff[t] = 0;
							}   //清空除接收数据外的数据,防止接收长数据后再次接收短数据出现问题
						Usart1_RxNum=0;
						Usart1_RxFlag = 1;   //接收完成标志
						HAL_UART_Transmit(&huart2 , (uint8_t *)Usart1_RxBuff,sizeof(Usart1_RxBuff), 0xFFFF);
							
					}
				HAL_UART_Receive_IT(&huart1,&ch1,1); //再次开启中断
		}
		
			/*串口2中断函数*/
  if (huart->Instance == USART2) // ???????????? USART1
		{  
				//判断是否是串口2的中断
				Usart2_RxBuff[Usart2_RxNum] = ch2;          //把串口接收的数据的数据写入
				Usart2_RxNum++;
				if(ch2 == 0x0a )
					{   //判断结束符(0x0d 回车,0x0a 换行符)		

								for(int t=Usart2_RxNum;t<512;t++)
									{ 
											Usart2_RxBuff[t] = 0;
									}   //清空除接收数据外的数据,防止接收长数据后再次接收短数据出现问题
								Usart2_RxNum=0;
								Usart2_RxFlag = 1;   //接收完成标志
								HAL_UART_Transmit(&huart2 , (uint8_t *)Usart2_RxBuff,sizeof(Usart2_RxBuff), 0xFFFF);
					}
				HAL_UART_Receive_IT(&huart2,&ch2,1); //再次开启中断
		}
}

串口发送的代码示例

HAL_UART_Transmit(&huart2 , (uint8_t *)"GoToMain\r\n",sizeof("GoToMain\r\n"), 0xFFFF);

总结

此时就完成了YF-S201-STM32-ESP8266的代码部分。
剩下的具体发送数据到EMQX服务器,参照串口调试助手-ESP8266-EMQX的路线,用STM32代替串口调试助手即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值