实验7 485组网实验_从机

1. 实验目的

本实验为非mobus方式,实现485组网。modbus组网参考实验三和实验四。

带485接口的串口屏,也可以进行485组网。要进行485组网,需要定义一套比较完整的协议。主机是谁,从机是哪些,主机和从机的地址需要定义好,不要冲突。

比较常见的,是485总线上一主机多从机的模式,主机可以主动发起查询和设置,从机只能被动响应主机的命令。

本实验和实验二类似,区别是解析的协议不同。本实验的协议仅仅简单的体现485怎么实现组网,仅供参考。

2. 页面设计

(1)整数控件,显示系统运行时间

(2)文本控件,中文显示系统运行状态

(3)协议解析器控件,解析串口协议

3. 串口屏协议处理

本实验通信协议定义如下:

报文帧格式

帧头

原地址

目的地址

命令码

参数

校验

0xA5

1Byte

1Byte

1Byte

N

2Byte

主机:STM32F103实验板 主机地址0x01

从机地址

命令码

参数长度

参数

校验

0xF1 温湿度模块

0x01主机发送 查询温湿度值

0字节

0xF1从机响应

6字节

[0~3]温度值 [4~5]湿度值

0x02主机发送 查询告警温度值

0字节

0xF2从机响应

6字节

[0~3]温度告警值 [4~5]湿度告警值

0x03主机发送 设置告警温度值

6字节

[0~3]温度告警值 [4~5]湿度告警值

0xF3从机响应

1字节

[0]是否成功

0成功,1失败

0xF3 从机显示屏

0x01主机发送 系统运行时间

2字节

[0~1]运行时间

单位,分钟

0xF1从机响应

1字节

0x02主机发送 系统运行状态

1字节

[0]运行状态

0系统正常 1系统故障

0xF2从机响应

0字节

本实验是从机串口屏,地址为0xF3,显示主机的系统参数。

串口屏处理串口数据,在协议解析器控件proto的接收事件里面。包括帧头,地址,命令码和校验的判断,参数获取然后赋值给控件,显示出来。

协议解析器接收事件的脚本代码

int crc_val;
int crc_data;
int len;
byte src_addr;
byte dst_addr;
byte buf[10];

if(proto.rxBuf[0] == 0xA5)
{
    src_addr = proto.rxBuf[1];
    dst_addr = proto.rxBuf[2];

    if(dst_addr == 0xF3)   //检测该命令,是否是本机的命令
    {
        len = proto.rxLen;
    
        crc_data = (proto.rxBuf[len-1]<<8) | proto.rxBuf[len-2];
        crc_val  = crc16(proto.rxBuf,0,len-2);
        if(crc_data == crc_val) //CRC判断
        {
            if(proto.rxBuf[3] == 0x01)  //主机设置温湿度故障信息
            {
                time.val = (proto.rxBuf[5]<<8) | proto.rxBuf[4];
                
                //命令响应
                buf[0] = 0xA5;
                buf[1] = dst_addr;
                buf[2] = src_addr;
                buf[3] = 0xF1;
                crc_val= crc16(buf,0,4); //计算CRC值
                buf[4] = (byte)crc_val;
                buf[5] = (byte)(crc_val>>8);
                uartSendBytes(buf, 0, 6);//发送数组的数据
            }
            else if(proto.rxBuf[3] == 0x02) //主机设置系统运行状态
            {
                if(proto.rxBuf[4] == 0)
                    sta.txt = "正常";
                else
                    sta.txt = "故障";
                    
                //命令响应
                buf[0] = 0xA5;
                buf[1] = dst_addr;
                buf[2] = src_addr;
                buf[3] = 0xF1;
                crc_val= crc16(buf,0,4); //计算CRC值
                buf[4] = (byte)crc_val;
                buf[5] = (byte)(crc_val>>8);
                uartSendBytes(buf, 0, 6);//发送数组的数据                    
                    
            }
        }
    }
}

每收到一次正确命令。解析完成后,需要组帧,然后调用uartSendBytes,响应主机的命令。

4. 下载验证

编译成功后,点击下载按钮,选择正确的端口号和波特率,下载到串口屏。

调试时,用电脑的串口助手给串口屏发命令

测试命令

» A5 01 F3 01 64 02 E2 3C //运行时间612

« A5 F3 01 F1 E9 4C //响应

» A5 01 F3 02 01 61 A6 //系统状态 故障

« A5 F3 01 F1 E9 4C //响应

显示屏如下图显示,则正确。