网关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:”
在弄懂任何一个程序代码时,都必须结合它相应的通信协议来看,单纯地看代码是弄不懂的
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:”
在弄懂任何一个程序代码时,都必须结合它相应的通信协议来看,单纯地看代码是弄不懂的
相关文章推荐
- 光模块光路与电路设计辅助工具代码(随便写写玩下,能够提高您能对光模块的理解,不过有待进一步补充)
- 如何更好的理解js中的this,分享2段有意思的代码
- Atitit 依赖管理之道 1. 概念 依赖管理,是指在什么地方以什么形式引入外部代码。 1 1.1.1. 理解模块化和依赖管理: 1 1.2. 依赖管理,有三个层面。 单一职责原则,协议对象引用,
- 编写易于理解代码的六种方式
- 图解分析汇编代码以理解计算机是如何工作的
- 看懂下面C++代码才说你理解了C++多态虚函数!
- EGOTableViewPullRefresh个人理解代码原理和使用
- Deep Learning论文笔记之(五)CNN卷积神经网络代码理解
- 码农的自我修养-对代码注释的理解
- CodeFirst中导航属性的代码实现 理解
- 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!
- ajax的进一步理解
- Mini Hook 主要代码理解
- 为什么你的代码如此难以理解
- JAVA动态代理模式(从现实生活角度理解代码原理)
- 对python调用微软API代码的理解
- Linux内核分析01-分析汇编代码理解计算机是如何工作
- pmtest8.asm中lib.inc中MemCpy代码的理解
- 读汤姆大叔《深入理解javascript系列》笔记一编写高质量代码
- 机器学习-决策树(理解+代码)