您的位置:首页 > 编程语言

网关2代码的进一步理解

2018-01-21 13:06 295 查看
代码的基本流程步骤:

1. 串口1和串口2的初始化,使能串口1,串口2接收中断

2. 设485的引脚为低电平,此时为接收模式

3. 各种中断的初始化

4. 串口3和定时器的初始化

5.然后判断各中断优先级的大小可知,定时器2先发生中断,然后串口3发生中断,再是定时器3,定时器4,最后是串口2发生中断(抢占优先级大的先处理,如果抢占优先级一样就比较响应优先级,响应优先级大的先处理)

6.如果接收完上位机组态王发来的一帧数据,就会进来此“数据帧处理函数 ParseRecieve8()”

7.判断设备地址是否匹配,若匹配就往下进行数据的处理,CRC校验,判断数据中的功能码(目前我们只用到03查询命令功能码和06控制命令功能码)

a .若是03功能码,则往下判断寄存器起始地址,然后计算回发的字节数,有用的数据长度(=总字节数减去2位CRC校验码)

b .将接收到从组态王发来的数据按照MODBUS协议依次存放在发送缓冲区里

c .然后将这个发送缓冲区里的数据传送到串口3里





8. 此时跳出函数,返回主函数,轮到串口3发生中断

9. 将串口3接收到的数据存放在数组里,“ReceBuf[recenum] = USART_ReceiveData(USART3)”

10. 然后再到定时器3发生中断

11. 定时器4发生中断,判断发送数据里的网关1的ID

(1)若是网关1-1,就进入这函数“Reply_GW(GW_Command_data) ”判断是何种功能码:

 a .若是查询命令,则进入“发送查询信息函数void Send_Message_Query”,将起始位,网关1的ID,校验码,消息长度,功能控制位,时间和结束符信息依次存放在一个数组里

 b .再进入 “RS485_Send_Data(GW1_send_Message,Send_Len)”这个函数,将刚才这些数组的数据发送到串口2里,然后将这些数据都打印出来

c .打印出来的这一串数据是17个字节(在查询命令的情况下,目前我们只有查询功能)

  例如:ae00010401720000002f ,这一帧数据的含义:

 查询命令0x02:(起始位+网关1ID+校验码+消息长度+功能控制位+time) 共17个字节 



d .再打印“查询命令打包成功”和“定时查询成功”

(2)若是网关1-2,运行跟网关1-1一样,最后打印的是“查询命令打包成功”和“网关2查询成功”

12. 最后到串口2发生中断

13. 将串口2接收到的数据存放在“ Com_GSM_data[Com_GSM_data_cp]  ”数组中

14. 若Com_GSM_data[Com_GSM_data_cp]里的数据有出现结束符0x2f,则说明接收完毕,串口1会打印“结束符:2f”和“接收到OK”这些信息

15. 将USART 2接收到的数据进行处理“void receiveuart2(void)”,判断数据已经全部接收完毕且接收到的数据和检查的信息不为0  “if(Receive_Check_Message(temp_GW)!=NULL)” 然后开始校验USART 2所接收到的数据“u8 Receive_Check_Message(u16 temp) ”

16.  首先会判断接收到一帧数据里的起始位,网关1的ID,校验码,消息长度,功能控制位还有此网关1底下所跟节点的所有信息:节点ID是否接收正确,节点名称,节点状态,返回结果,结束符,然后将这些信息全都打印出来

17.若数据校验完毕,则串口1会打印“接收校验码”,然后判断是何种命令,若是查询命令0x02则继续往下判断是否是网关1-1:

a. 是的话,会将要回复给组态王的数据存放在“GW1_send_Message[]”数组里,然后再将这一串数据打印出来

b. 之后就是一个一个节点地查询,然后串口1会打印相应的节点ID“节点认证数据”,同时判断该节点当前的电源状态,如是通着电则会打印“room A406 ON”

c. 还有打印出当前查询节点的数目,如果当前查询的节点数目已达到10,则把所有节点的信息打包上传给组态王,同时打印“上传组态王数据:”

d. 查询完网关1-1后,再继续查询网关1-2,如果当前查询的节点数目已达到2,则把所有节点的信息打包上传给组态王,同时打印“上传组态王数据2:”

在弄懂任何一个程序代码时,都必须结合它相应的通信协议来看,单纯地看代码是弄不懂的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息