系列文章目录
STM32-ESP8266-EMQX-WPF方案实现之STM32采集数据和串口收发
前言
通过STM32采集数据,ESP8266连接热点发送数据到云服务器EMQX,EMQX转发给WPF应用程序的方案
此文章是通过STM32采集流量传感器YF-S201数据和发送数据到ESP8266。主要内容就是定时器TIM2捕捉脉冲和串口发送、中断接收的内容。
一、TIM2定时器设置
选择的是YF-S201传感器,需要注意:
- 红正黑负,黄色信号线
- 工作电压5-18V
- 水压1.75Mpa以下
- NPN脉冲信号
- 流速:
如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代替串口调试助手即可。