Files
SM-1000M/RTX5_20220316/Driver/usart/usart2.c
2026-04-23 10:50:18 +08:00

530 lines
20 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************
头文件
*********************************************************************************
*/
#include "usart2.h"
#include "bsp.h"
/*
************************************************************************************
变量定义
************************************************************************************
*/
char USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; //发送缓冲,最大USART2_MAX_SEND_LEN字节
vu16 USART2_RX_STA=0;
/*
*********************************************************************************************************
* 函 数 名: USART2_ReceiveBuff_Clear()
* 功能说明: 清空数组USART2_RX_BUF
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void USART2_ReceiveBuff_Clear(void)
{
USART2_RX_STA=0;
memset(USART2_RX_BUF,0,USART2_MAX_RECV_LEN);
}
/*
*********************************************************************************************************
* 函 数 名: USART2_Configuration()
* 功能说明: 串口2配置
* 输 入 波特率baund
* 输 出 :无
*********************************************************************************************************
*/
void USART2_Configuration(u32 baund)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能USART2
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //GPIOB时钟
USART_DeInit(USART2); //复位串口1
//USART2_TX PB.10 PB.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
USART_InitStructure.USART_BaudRate = baund;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2,&USART_InitStructure);
USART_Cmd(USART2,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启USART2的接收中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口3中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
USART_ClearFlag(USART2,USART_FLAG_TC); //清除发送完成标志位
}
/*
*********************************************************************************************************
* 函 数 名: u3_printf()
* 功能说明: 串口3输出
* 输 入
* 输 出
*********************************************************************************************************
*/
void u2_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
USART2_ReceiveBuff_Clear();
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART2_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART2,USART2_TX_BUF[j]);
}
}
/*
*********************************************************************************************************
* 函 数 名: timer2_init()
* 功能说明: 定时器2配置
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void timer2_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 3199;
TIM_TimeBaseStructure.TIM_ClockDivision = 1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* TIM IT enable */
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* TIM2 enable counter */
TIM_Cmd(TIM2, DISABLE);
/* Enable the TIM2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE); //使能TIMx
}
/*
*********************************************************************************************************
* 函 数 名: TIM2_Set()
* 功能说明: 定时器2开关
* 输 入 sta 0 1
* 输 出 :无
*********************************************************************************************************
*/
void TIM2_Set(unsigned char sta)
{
if(sta)
{
TIM_SetCounter(TIM2,0);//计数器清空
TIM_Cmd(TIM2, ENABLE); //使能TIMx
}else TIM_Cmd(TIM2, DISABLE);//关闭定时器2
}
/*
*********************************************************************************************************
* 函 数 名: TIM2_IRQHandler()
* 功能说明: 定时器2中断按键扫描
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
WKUP_PIN_Status=Key_Scan();
}
}
/*
*********************************************************************************************************
* 函 数 名: USART2_IRQHandler()
* 功能说明: 串口2接收中断
* 输 入 USART2_RX_BUF[]
* 输 出 :无
*********************************************************************************************************
*/
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);
if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
{
if(USART2_RX_STA<(USART2_MAX_RECV_LEN-1)) //还可以接收数据
{
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
}
}
/*
*********************************************************************************************************
* 函 数 名: USART2_Recieve_Ide()
* 功能说明: 远传下发指令查询
* 输 入 :无
* 输 出 :无
*********************************************************************************************************
*/
void USART2_Recieve_Ide(void)
{
u8 i = 0;
u16 temp_u16=0;
char temp_datas[100]={'0'};
char *recString;
char *recStringNext;
char adda;
char year_head[3];
char hhmmss[7]={'\0'},yymmdd[10]={'\0'};
Init_Data Init_Data_Equipment_temp;
Init_Data_Equipment_temp=Read_Equipment_Par();//读取设备参数
if( 1 )
{
/************恢复出厂设置参数***********/
if((strstr(USART2_RX_BUF, "parw-rst")!=NULL))//接收恢复出厂设置
{
Write_Factory_Par();
EEPROM_ReadBytes(140,&Par_store_flag,1);
if(Par_store_flag)BC25_Senddata_mode(13,"parw-rst,OK,*");
else BC25_Senddata_mode(13,"parw-rst,fail,*");
}
/*写入******设备ID、测量间隔、预约时间、测量模式、远传时间*********/
if((strstr(USART2_RX_BUF, "parw-1")!=NULL))//判断接收信息是否是命令参数设置
{
if((strstr(USART2_RX_BUF, Init_Data_Equipment.Equipment_ID)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.Measure_Interval)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.appointment_time)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.measure_mode)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.Pub_Time)!=NULL))
{
Init_Data_Equipment.par_change=0;
EEPROM_WriteBytes(185, 0,1);
}
else
{
Init_Data_Equipment.par_change=1;
EEPROM_WriteBytes(185, &Init_Data_Equipment.par_change,1);
}
memset(temp_datas,0,100);
for (i = 0 ; i < 5 ; i++)
{
if (i == 0)
{
if ((recString = strstr(USART2_RX_BUF, "parw-1")) == NULL)
;
recString+=6;
}
else
{
recString++;
if((recStringNext = strstr(recString, ",")) != NULL)
{
switch(i)
{
case 1: memset(Init_Data_Equipment.Equipment_ID,0,10);
memcpy(Init_Data_Equipment.Equipment_ID, recString, recStringNext - recString);
case 2: memset(Init_Data_Equipment.Measure_Interval,0,5);
memcpy(Init_Data_Equipment.Measure_Interval, recString, recStringNext - recString);
temp_u16=hexToDec(Init_Data_Equipment.Measure_Interval);
memset(Init_Data_Equipment.Measure_Interval,0,5);
sprintf(Init_Data_Equipment.Measure_Interval,"%d",temp_u16);
break; //获取测量间隔
case 3: memset(Init_Data_Equipment.appointment_time,0,appointment_time_len);
memcpy(Init_Data_Equipment.appointment_time, recString, recStringNext - recString);break; //预约时间
case 4: memset(Init_Data_Equipment.measure_mode,0,1);
memcpy(Init_Data_Equipment.measure_mode, recString, recStringNext - recString);break; //测量模式
default:break;
}
}
recString=recStringNext;
if(i==4)
{
recString++;
recStringNext=strstr(recString,",*");
memset(Init_Data_Equipment.Pub_Time,0,Pub_Time_len);
memcpy(Init_Data_Equipment.Pub_Time, recString, recStringNext - recString);
temp_u16=hexToDec(Init_Data_Equipment.Pub_Time);//
if(temp_u16<1)temp_u16=1;
memset(Init_Data_Equipment.Pub_Time,0,Pub_Time_len);
sprintf(Init_Data_Equipment.Pub_Time,"%d",temp_u16);
}
}
}
if(hexToDec(Init_Data_Equipment.Measure_Interval)<1)//测量间隔时间min
sprintf(Init_Data_Equipment.Measure_Interval,"%s","00001");//测量间隔最小60S
Write_Equipment_Par(Init_Data_Equipment);
BC25_Senddata_mode(11,"parw-1,OK,*");
if(strcmp(Init_Data_Equipment_temp.Equipment_ID,Init_Data_Equipment.Equipment_ID)||
strcmp(Init_Data_Equipment_temp.Measure_Interval,Init_Data_Equipment.Measure_Interval)||
strcmp(Init_Data_Equipment_temp.appointment_time,Init_Data_Equipment.appointment_time)||
strcmp(Init_Data_Equipment_temp.measure_mode,Init_Data_Equipment.measure_mode)||
strcmp(Init_Data_Equipment_temp.Pub_Time,Init_Data_Equipment.Pub_Time))
{
Init_Data_Equipment.par_change=1;
EEPROM_WriteBytes(185, &Init_Data_Equipment.par_change,1);
}
if((Init_Data_Equipment.measure_mode[0]=='1') && (IsAppointmentRight()))
{
Measure_Ap_S();
}
else
{
Measure_Ap_E();
}
}
/*写入******远传IP、远传端口、wifi名称、wifi密码、wifi端口*********/
if((strstr(USART2_RX_BUF, "parw-2")!=NULL)&(strstr(USART2_RX_BUF, "\"")!=NULL))
{
/* 判断参数是否与上次一样*/
if((strstr(USART2_RX_BUF, Init_Data_Equipment.Bc25_Ip)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.Bc25_Port)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.ESP8266_AP_SSIDs)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.ESP8266_AP_PWDs)!=NULL)&
(strstr(USART2_RX_BUF, Init_Data_Equipment.ESP8266_AP_Ports)!=NULL))
{
Init_Data_Equipment.par_change=0;
EEPROM_WriteBytes(185, 0,1);
}
else
{
Init_Data_Equipment.par_change=1;
EEPROM_WriteBytes(185, &Init_Data_Equipment.par_change,1);
}
for (i = 0 ; i < 5 ; i++)
{
if (i == 0)
{
if ((recString = strstr(USART2_RX_BUF, "parw-2")) != NULL)
;//解析错误
recString+=6;
}
else
{
recString++;
if((recStringNext = strstr(recString, ",")) != NULL)
{
switch(i)
{
case 1: memset(Init_Data_Equipment.Bc25_Ip,0,20);
memcpy(Init_Data_Equipment.Bc25_Ip, recString, recStringNext - recString);break; //iot ip
case 2: memset(Init_Data_Equipment.Bc25_Port,0,10);
memcpy(Init_Data_Equipment.Bc25_Port, recString, recStringNext - recString);break; //iot port
case 3: memset(Init_Data_Equipment.ESP8266_AP_SSIDs,0,20);
memcpy(Init_Data_Equipment.ESP8266_AP_SSIDs, recString, recStringNext - recString);break; //wifi 名称
case 4: memset(Init_Data_Equipment.ESP8266_AP_PWDs,0,10);
memcpy(Init_Data_Equipment.ESP8266_AP_PWDs, recString, recStringNext - recString);break; //wifi 密码
//case 5:memcpy(temp_datass, recString, 12);break; //获取系统时间
default:break;
}
}
recString=recStringNext;
}
}
memcpy(Init_Data_Equipment.ESP8266_AP_Ports, recString+1, 4); //获取wifi port
Write_Equipment_Par(Init_Data_Equipment);
BC25_Senddata_mode(11,"parw-2,OK,*");
if(strcmp(Init_Data_Equipment_temp.Bc25_Ip,Init_Data_Equipment.Bc25_Ip)||
strcmp(Init_Data_Equipment_temp.Bc25_Port,Init_Data_Equipment.Bc25_Port)||
strcmp(Init_Data_Equipment_temp.ESP8266_AP_SSIDs,Init_Data_Equipment.ESP8266_AP_SSIDs)||
strcmp(Init_Data_Equipment_temp.ESP8266_AP_PWDs,Init_Data_Equipment.ESP8266_AP_PWDs)||
strcmp(Init_Data_Equipment_temp.ESP8266_AP_Ports,Init_Data_Equipment.ESP8266_AP_Ports))
{
Init_Data_Equipment.par_change=1;
EEPROM_WriteBytes(185, &Init_Data_Equipment.par_change,1);
}
}
/*写入******立刻启动测量*********/
if((strstr(USART2_RX_BUF, "parw-3")!=NULL))
{
if ((recString = strstr(USART2_RX_BUF, "parw-3,1")) != NULL)
{
if(TASKRUNSS.APPO_RUN|TASKRUNSS.PROS1_RUN)//判断测量任务是否被占用
{
BC25_Senddata_mode(11,"parw-3,OK,*");
}else
{
MYITStatus1.WKUP_MEA_WIFI=1;
BC25_Senddata_mode(11,"parw-3,OK,*");
}
}
if ((recString = strstr(USART2_RX_BUF, "parw-3,0")) != NULL)
{
}
}
/*设置******系统时间*********/
if((recString=strstr(USART2_RX_BUF, "parw-4")) !=NULL)
{
memset(temp_datas,0,100);
recString+=7;
memcpy(temp_datas, recString, 13); //获取系统时间
if(((temp_datas[4]-'0')*10+(temp_datas[5]-'0')*1)>12|
((temp_datas[6]-'0')*10+(temp_datas[7]-'0')*1)>31|
((temp_datas[8]-'0')*10+(temp_datas[9]-'0')*1)>23|
((temp_datas[10]-'0')*10+(temp_datas[11]-'0')*1)>59|
((temp_datas[12]-'0')*10+(temp_datas[13]-'0')*1)>59)
{
BC25_Senddata_mode(13,"parw-4,fail,*");
}else
{
SetRTC(
((temp_datas[2]-'0')*10+(temp_datas[3]-'0')*1),
((temp_datas[4]-'0')*10+(temp_datas[5]-'0')*1),
((temp_datas[6]-'0')*10+(temp_datas[7]-'0')*1),
((temp_datas[8]-'0')*10+(temp_datas[9]-'0')*1),
((temp_datas[10]-'0')*10+(temp_datas[11]-'0')*1),
((temp_datas[12]-'0')*10+(temp_datas[13]-'0')*1)
);
DS3231_Set(
((temp_datas[2]-'0')*10+(temp_datas[3]-'0')*1),
((temp_datas[4]-'0')*10+(temp_datas[5]-'0')*1),
((temp_datas[6]-'0')*10+(temp_datas[7]-'0')*1),
((temp_datas[8]-'0')*10+(temp_datas[9]-'0')*1),
((temp_datas[10]-'0')*10+(temp_datas[11]-'0')*1),
((temp_datas[12]-'0')*10+(temp_datas[13]-'0')*1)
);
EEPROM_WriteBytes(170,(u8*)temp_datas,2);
if((RTC->CR)&0x100)//已经开启了远传闹钟
{
RTC_AlarmAConfig(get_pubidv());
}
if((RTC->CR)&0x200)//已经开启间隔闹钟
{
RtcWakeUpConfig(get_meaidv() - 1);
}
BC25_Senddata_mode(11,"parw-4,OK,*");
Init_Data_Equipment.par_change=1;
EEPROM_WriteBytes(185, 0,1);
}
}
/*写入******传感器地址修改*********/
if((recString=strstr(USART2_RX_BUF, "parw-5")) !=NULL) //parw-aAb,0A1
{
recString=strstr(recString, ",");
recString++;
recStringNext=recString+2;
Sdi_chanegadd(recString[0],recStringNext[0]);
adda=Sdi_Readone(recStringNext[0]);
if(adda==0)
{
BC25_Senddata_mode(11,"parw-5,OK,*");
//数值相同
}else
BC25_Senddata_mode(13,"parw-5,fail,*");
}
/*读取******设备ID、测量间隔、预约时间、测量模式、远传时间*********/
if((recString=strstr(USART2_RX_BUF, "parr-1")) !=NULL)
{
//&&(strstr(USART2_RX_BUF.Data_RX_BUF, "\r\n"))!=NULL)
memset(temp_datas,0,100);
Init_Data_Equipment=Read_Equipment_Par();
sprintf(temp_datas,"parr-1,%s,%d,%s,%s,%d,*",
Init_Data_Equipment.Equipment_ID,
hexToDec(Init_Data_Equipment.Measure_Interval),
(Init_Data_Equipment.appointment_time),
(Init_Data_Equipment.measure_mode),
hexToDec(Init_Data_Equipment.Pub_Time)
);
BC25_Senddata_mode(strlen(temp_datas),temp_datas);
}
/*读取******远传IP、远传端口、wifi名称、wifi密码、wifi端口*********/
if(strstr(USART2_RX_BUF, "parr-2"))
{
memset(temp_datas,0,100);
GetRTC(hhmmss,yymmdd);
sprintf(temp_datas,"%s,%s,%s,%s,%s,%s,*",
"parr-2",
Init_Data_Equipment.Bc25_Ip,
Init_Data_Equipment.Bc25_Port,
Init_Data_Equipment.ESP8266_AP_SSIDs,
Init_Data_Equipment.ESP8266_AP_PWDs,
Init_Data_Equipment.ESP8266_AP_Ports
);
BC25_Senddata_mode(strlen(temp_datas),temp_datas);
}
/*读取******系统时间 日期*********/
if(strstr(USART2_RX_BUF, "parr-4"))
{
memset(temp_datas,0,100);
GetRTC(hhmmss,yymmdd);
EEPROM_ReadBytes(170, (u8*)year_head,2);
sprintf(temp_datas,"parr-4,%s%s %s,*",year_head,yymmdd,hhmmss);
BC25_Senddata_mode(strlen(temp_datas),temp_datas);
}
/*读取******传感器地址查询*********/
if((recString=strstr(USART2_RX_BUF, "parr-s?")) !=NULL)
{
memset(temp_datas,0,100);
Init_Data_Equipment=Read_Equipment_Par();
sprintf(temp_datas,"parr-6,%d,*", hexToDec(Init_Data_Equipment.Equipment_ID));
BC25_Senddata_mode(strlen(temp_datas),temp_datas);
}
}
}
/***************************** END OF FILE *********************************/