注意:RM10 用于网关与后台
之间的通讯:HC-12 用于网关
与节点之间的通讯;TIM2 用
于网关与后台服务器之间:
TIM3 用于网关与节点之间
网关程序流程图
Stm32_Clock_Init(9)进行系统时钟配置
延时初始化
uart1_init(72,115200);
uart2_init(36,115200);
uart3_init(36,9600);串口 1、2、3 初始化
(注意:串口 1 进行下载程序及串口调试信息打印;
串口 2 进行用于跟 RM10 通讯,即后台与网关 RM10
进行通讯;串口 3 进行用于跟 HC-12 通讯,即网
关与节点之间进行通讯。
串口 2、3 虽然用于跟 RM10、HC-12 通讯,但是并
不涉及到它们的代码,因为我们可以直接通过无
线通讯。)
第一阶段初始化
Init_GPIO() 初始化 HC-12/R485 的控制引脚、两个
开始执行判断网关状态
(注意:因为当网关下电后
EEPROM 会立即储存相应
状态,然后上电后开始从
EEPROM 读取之前状态)
LED 灯的引脚、一个蜂鸣器的引脚、一个恢复出厂
设置的引脚、七个拨码开关 IO
Init_RM10() 初始化 RM10 的两个复位引脚,均置高
Timer2_Init(1999,7199) 定时器 2 初始化,利用定时
器 2 中断解析串口数据包,每 200ms 一次。
(注意:每 200ms 进行一次检验,用于网关和后台服
务器之间的不断检测,不断执行)在闪灯任务
run-ok 时, 若长时间收不到应答判断为断网,
开启蜂鸣器报警;如果从开始控制节点计时,若
ND-overtime 时间内没有回复,在控制第二个节点。
while(RTC_Init()) 进行 RTC 初始化
(注意:RTC 时钟一定要初始化成功,因为每发送
一个数据对应一个时间)
AT24CXX_Init() 初始化 IIC 接口
while(AT24CXX_Check()) 等到检测不到 24c128 后
开始 EEPROM_Reader() 读取 EEPROM
若为
Gwsta_run_ok 网
关正常运行状态
开始进行
亮
EEPROM_ND_Type_Rea
der(),节点类型和对应
在节点中的位置读取
(
若为网关一开始的状态
此时 RM10 需要延时 50ms 等待启动
才会进行启用,判断网关的以下状态
1.Gwsta_init_toAP 即 AP 模式时,
(蓝亮绿灭红快闪)延时 1s 后,
后台开始向网关发送 0 字符,
打印“AP 模式”。注意:配置
RM10 之前需要重启模块(RM10_RST(), RM10_AT())之后后台
向网关 RM10 发送配置信息 usart2_sendstring(commands_wifi_ap,490)
等待 AP 模式配置成功,若配置不成功,会自动重新重启,重新配置。
2.Gwsta_init_cntoPhone 和手机连接时,给 RM10 发送配置信息。此时(
蓝亮绿亮红快闪)
3.Gwsta_init_tocilent:为配置为客户端模式,此时(蓝亮绿灭红慢闪)
若有手机端的时候,利用 for 语句循环发送给 RM10 对其进行配置
for(i=0;iAPB1ENR|=1<<1
TIM3 时钟使能
对定时器 3 进行初始化(注
意:TIM3 只用于网关与节点
之间的通讯,要时时检测心
数
跳情况)
同时设置才可以进行中断
允许更新中断 使能 TIM3
设定计数器自动重装值
TIM3->ARR=arr
预分频器 7200,得到 10khz 的计
数时钟 TIM3->PSC=psc
设置 MY_NVIC_Init(5,0,TIM4_IRQChannel,3)抢占 3 子优先级 0 组 3
配置好后利用定时器 3 中断进行
(
任务调度
如果处于空闲状态
即 Free_station 时
命令任务调度
即
GW_ok_station
开始打
如果处于繁忙状态
即 Busy_station
(
read_COM_RM10_data_cp==COM_RM10_data_c
即解读 RM10 数据包=RM10 接收数据包时,
如 果 Tim_timing_report==ND_Heartbeat_Timer)
即
定时上传计时=心跳更新时间时(网关和节点)
开始打印“节点时间广播”,定时上传计时归为
0, 之后使消息头命令=节点更新的时间 网关
ok 状态=繁忙状态 即
Message_Header_data.Command_Id=gw_C
ommand_heartbeat_ND_act;
GW_ok_station=Busy_station ;
如果定时上传计时=节点定时时长(60s 一次)
即 Tim_timing_report==Report_Timer 时,处于
“定时查询”状态打印“定时查询”使消息
头 命 令 = 网 关 中 的 明 令 要 求 即
Message_Header_data.Command_Id=gw_Comm
and_inquire;
如果心跳计时(网关和后台)>=心跳时长(30s
一次)即 Tim_Heartbeat>=Heartbeat_Timer,处
于心跳链接状态,打印“心跳链接”,之后使心
跳计时=0,变为“死亡状态”,即 Tim_Heartbeat=0
然
使
Message_Header_data.Command_Id=gw_Comm
and_heartbeat_act(注意:这个网关命令是没有
的,只作为给后台的心跳链接标志)
后
当消息头数据命令=网关配置命令、消息
头数据命令=网关询问命令时,即
gw_Command_config,gw_Command_inquire
时,如在 read_COM_RM10_data_cp==COM--
RM10-data-c 情况下,
如果最低命令要求标志=free
如果 Command_exe(Message_Header_data.
Command_Id,Message_Header_data.Nodecount
_amount)!=NULL,则开始给后台回复命令,进
行不断地打包发包,之后打印“数据上传完毕”
之后取节点平均值
Measure_Average()
之后进行网关信息的存储:网关 ID、网关
当前状态,网关下挂节点的个数,网关下挂
节点配置表
之后 使 GW_ok_station=Free_station
如没有在 read_COM_RM10_data_cp==COM--
RM10-data-c 情况下,
如果 ND_order_flag==Free,则直接使
GW_ok_station=Free_station
当消息头命令=网关控制 1 命令时,即
gw_Command_control:
如果 ND_order_flag==Free 情况下,
如果 Command_exe(Message_Header_data.
Command_Id,Message_Header_data.Nodecount
_amount)!=NULL,则开始给后台回复命令,进
行不断地打包发包,之后打印“数据上传完毕”
之后开始使心跳计时(网关和后台)=0,定时
上传计时=0.即 Tim_Heartbeat=0
Tim_timing_report=0;
之后进行网关信息的存储:网关 ID、网关
当前状态,网关下挂节点的个数,网关下挂节
点配置表
之后 使 GW_ok_station=Free_station
当消息头命令=网关回复后台心跳命
令时,即 gw_Command_heartbeat
则直接进行数据打包发包,之后打印
“数据上传完毕”
当消息头命令= 网关响应命令时,即
gw_Command_respond ,则直接进行
断网计时清零 Tim_Police=0
和关闭蜂鸣器 BEEP_OFF;
之后使其处于 GW_ok_station=Free_station
当消息头命令= 主动发送心跳时(注:
实际上网关没有主动发送心跳这个命令)
即:gw_Command_heartbeat_act
此时直接进行数据打包发包,之后打印
“数据上传完毕”,同时也别忘了使网关
Ok 状态==Free_station。
当消息头命令= 网关只会给控制节点下
(
发消息时,即
gw_Command_heartbeat_ND_act
此时直接进行数据打包发包,之后打印
“数据上传完毕”,同时也别忘了使网关
Ok 状态==Free_station。
(