处理子函数中判断是否通讯超时(本次设定为5s),如果超时,即使已经有接受到数据也置之不理,进行重置485、清零地址偏移器、清零偶校验;除此之外每次发送数据结束后我们也需要进行这样处理。程序流程图如5-1所示:
定时处理开始 1ms Timer1中断开始 1ms标志=1? 重装初值 Y 清零1ms标志 1ms标志位设为1 通讯超时否? N 结束 485置为接收 Y N 接受地址偏移寄存器清零 偶校验清零 结束
图5-1提高通讯稳定性的程序设计
⑵发送和接收缓冲区数据处理:
在Modbus协议里,报文的都是以包的形式来发送与接收的,设计中用两个数组来定义数据包的发送和接收缓冲区。发送接收缓冲区再与单片机的串口锁存器sbuf进行交换来实现数据包的发送与接收,在程序中还同时使用偶校验来对传输数据进行检测;在此设置串口中断服务程序,当接收或者发送完8个数据后进入服务程序内处理以上功能。具体程序流程图如5-2下所示:
14
串行口中断开始 TI=1? Y 清零TI中断标志位 N RI=1? Y 清零RI中断标志位 发送位置<发送字节个数? Y 发送缓冲区数据发给串口锁存器(加上校验位) 设置通讯超时值 N 串口锁存器的值发给接受缓冲区 测试校验是否出错 485置为接收 接受地址偏移寄存器清零 偶校验清零 结束
图5-2发送和接收缓冲区数据处理
⑶主机发送数据包和从机响应主机数据包的具体软件实现:
本次设计中我们定义从机(B机)地址为Ox01;采用查询扫描方式,当从机接受数据包第一个有效数据为0X01时说明确实是该机,如果偶校验也正确的话则继续处理接下来的数据;为保证通讯数据的可靠和可信性我们还需要对接收缓冲区做CRC校验。接下来判定第二个数据(即功能码),该设计中除了[03]还扩展了[01][05][06]等功能码以提高代码可移植性,对其扫描检测,如果是[03]则进入读取保存寄存器子函数;在读取保存寄存器子函数里,分别读出接收缓冲区的第三、第四个数据对应得逻辑地址和第五、第六个数据对应的逻辑地址长度。通过逻辑地址我们可以知道要处理的数据,通过逻辑地址长度我们可以知道需要返回的字节数。在这里我们对从机(B机)发来的温度,时钟数据进行处理;处理完后再把这些数据和设备地址、命令号、返回字节数回应给发送缓冲区,再对缓冲区数据进行CRC校验计算。 流程图如5-3所示:
15
检查Uart0数据开始 读取保存寄存器开始 N 设备地址、偶校正确否? Y 对接收缓冲区做CRC校验 读取接收的逻辑地址 读取地址长度 CRC校验正确? N Y 功能码为03否? Y 对应逻辑地址处理数据,需要将温度、时钟的时、分等数据对应给发送缓冲区 将设备地址、命令号、返回字节数对应给发送缓冲区 N:结束或看是否为其它功能 对缓冲区数据进行CRC计算 接受地址偏移寄存器清零 偶校验清零 开始发送缓冲区第一个数据 结束
图5-3 数据包处理
5.2 A机流程图和说明
A机的功能是显示时钟,能通过按键控制B机显示温度或把A机的时钟信号无线传输给B机;所以在程序中需要初始化液晶、无线模块、定时器、还要设置按键扫描和无线接受中断(这里用单片机外部中断0来实现)。程序流程图如5-4所示:
16
主程序开始 Timer0中断开始 无线接收中断开始 液晶初始化 时钟更新 判断中断标志 无线模块初始化 Sendflag为1? Y 读取接收到的数据 定时器0初始化 N 更新液晶显示 发送温度信息 按键扫描 中断返回 中断返回 结束 结束 结束
图5-4 A机流程图
5.3 B机流程图和说明
B机的功能是依据A机命令使它显示温度还是时钟,在主机(PC机)命令下再把温度和时钟信号通过Modbus协议基于485接口响应读取给主机。所以程序中需要初始化无线模块、串口、定时器等;Modbus协议都在主程序中得以体现。另外数码管显示部分和无线部分处理分别使用Timer0中断和无线接收中断。程序流程图如5-5所示:
17
主程序开始 Timer0中断开始 无线接收中断开始 读取一次温度信息 数码管扫描 判断中断标志 无线模块初始化 时钟更新 读取接收到的数据 Timer0、1mTimer1、串口初始化(设置波特率等);无线模块设置为接收 中断返回 置位rcv 结束 定时处理 判断接收到的命令 显示时钟并与A机同步 检查uart0口数据 结束 N 显示温度发回温度信息 rcv为1? Y LED闪烁 结束
图5-5 B机流程图
5.4 本章小结
在这一章中我们介绍了基于MODBUS协议处理报文的软件设计,介绍了报文格式、软件具体实现的方法和注意事项,并设计的介绍了流程图,设计中对系统稳定性方面下了功夫。除此之外还介绍了A机流程图和说明、B机流程图和说明。
18