实验17 485组网
1. 实验目的
使用自定义协议,通过485接口,完成设备间通讯。
一个主站与三个从从站之间通讯。
2. 实验设计
主站控制三个从站的背光亮度。
主站接收从站的状态,并显示在主站上。
3. 硬件连接方式
一个主机和三个从机,都是用485接口的串口屏。
制作485总线,由于实验简单,此次实验把串口屏电源和地线,全部接在一起,如下图:
4. 主站实现
4.1. 界面布局
4.2. 关键控件介绍
控件名称 |
控件类型 |
控件功能 |
---|---|---|
Slider_slave1 |
滑块 可见 |
滑动滑块,发送滑块值(1-100)作为从机1的亮度值。 |
Slider_slave2 |
滑块 可见 |
滑动滑块,发送滑块值(1-100)作为从机2的亮度值。 |
Slider_slave3 |
滑块 可见 |
滑动滑块,发送滑块值(1-100)作为从机3的亮度值。 |
Status_slave1 |
圆形 可见 |
收到从机1发来的状态值,改变颜色和从机同步 |
Status_slave2 |
圆形 可见 |
收到从机2发来的状态值,改变颜色和从机同步 |
Status_slave3 |
圆形 可见 |
收到从机3发来的状态值,改变颜色和从机同步 |
Protocol0 |
自定义协议,不可见 |
接收和从机发过来的数据并解析成不同状态在主机显示 |
arr_send |
数据发送数组 |
用户协议数据组包 |
4.3. 功能实现逻辑
4.3.1. 页面加载
加载页面时,初始化发送数组。
初始化发送数组 为了数据组装方便性,使用数组来做帧格式的每个项
数据帧格式:帧头(固定为:0x0a)+从机地址(byte)+数据位(byte)+帧尾(固定为0x0b)
从机1地址:0x01
从机2地址:0x02
从机3地址:0x03
加载页面的脚本如下:
arr_send.valbs[0]=0x0a;//帧头
arr_send.valbs[1]=0x00;//从机地址初始值
arr_send.valbs[2]=0x00;//发送数据初始值
arr_send.valbs[3]=0x0b;//帧尾
4.3.2. 滑动滑块,改变从机的背光亮度
当滑动滑块时,会产生值改变事件和滑块值(1-100)的变化
通过值改变事件的脚本,发送滑块的滑动值给从机。
从机接收到滑动值,把背光亮度的级别设置为滑动值,就能改变背光亮度。
滑块值改变事件脚本如下:
arr_send.valbs[1]=0x01;//设置从机1的地址
arr_send.valbs[2]=(byte)slider_slave1.val;//取滑块值设置为从机1的亮度值(0\~100)
uartSendBytes(arr_send.valbs,0,4);//发送协议数据给从机1
4.3.3. 自定义协议-数据接收事件
自定义协议控件可以接收发送给本机的数据。
判断帧头是否给本实验所作的协议的帧头。
判断是哪个从机发来的数据。
判断从机的状态,改变代表从机的圆形的颜色,和从机一致。
自定义协议接收数据是个16进制的固定长度的数组,接收到的数据,为左对齐的格式,属性为rxBuf。rxBuf[0],为数据的第1个字节,rxBuf[1],为数据的第2个字节,以此类推。
自定义协议数据接收事件的脚本如下:
/*
接收从机的数据,设置从机的状态,状态用颜色来标记:红,绿,蓝。
从机1地址:0x01
从机2地址:0x022
从机3地址:0x03
*/
//检查帧头是否正确,判断地址是否是从机1
if(protocol0.rxBuf[0]==0x0a&&protocol0.rxBuf[1]==0x01)
{
if(protocol0.rxBuf[2]==0x01)
{
status_slave1.fColor=0xff0000ff;
}
//收到从机数据,如果为0x02,从机1的圆形标志的颜色改为绿色
else if(protocol0.rxBuf[2]==0x02)
{
status_slave1.fColor=0xff00ff00;
}
//收到从机数据,如果不是0x01,0x02,从机1的圆形标志的颜色改为红色
else
{
status_slave1.fColor=0xffff0000;
}
}
//从机2,3都类似
if(protocol0.rxBuf[0]==0x0a&&protocol0.rxBuf[1]==0x02)
{
if(protocol0.rxBuf[2]==0x01)
{
status_slave2.fColor=0xff0000ff;
}
else if(protocol0.rxBuf[2]==0x02)
{
status_slave2.fColor=0xff00ff00;
}
else
{
status_slave2.fColor=0xffff0000;
}
}
if(protocol0.rxBuf[0]==0x0a&&protocol0.rxBuf[1]==0x03)
{
if(protocol0.rxBuf[2]==0x01)
{
status_slave3.fColor=0xff0000ff;
}
else if(protocol0.rxBuf[2]==0x02)
{
status_slave3.fColor=0xff00ff00;
}
else
{
status_slave3.fColor=0xffff0000;
}
}
4.4. 实验结果
滑动主机上代表从机1背光亮度的滑块,从机1背光亮度根据滑块的动作,进行明暗变换。
滑动其他其他从机的滑块,相应从机会进行相应的明暗变换。
5. 从站实现
5.1. 界面布局
控件名 |
控件类型 |
控件功能 |
---|---|---|
Textbox4 |
可见 文本框 |
显示主站标识 master“ |
Ellipse_red_big |
可见 圆形 |
设置主站状态为红色 |
Ellipse_green_big |
可见 圆形 |
设置主站状态为绿色 |
Ellipse_blue_big |
可见 圆形 |
设置主站状态为蓝色 |
Hotzone |
不可见 触摸热区 |
点击热区,执行热区脚本,发送状态数据到主机 |
Image |
可见 图片 |
作为装饰,界面好看一些 |
每个颜色各有一大一小两个圆,用来表示从机选中的状态,大圆层级高于小圆,当大圆可视性为0,则会被隐藏,从而显示小圆
5.2. 功能实现逻辑
5.2.1. 页面加载
加载页面时,初始化发送数组。
初始化发送数组 为了数据组装方便性,使用数组来做帧格式的每个项
数据帧格式:帧头(固定为:0x0a)+本机地址(byte)+数据位(byte)+帧尾(固定为0x0b)
从机1地址:0x01 从机2地址:0x02 从机3地址:0x03
加载页面的脚本如下:
arr_send.valbs[0]=0x0a;//帧头
arr_send.valbs[1]=0x01;//本机地址
arr_send.valbs[2]=0x00;//发送数据初始值
arr_send.valbs[3]=0x0b;//帧尾
5.2.2. 触摸热区发送从机状态到主机显示
每个圆上覆盖一个触摸热区,在热区的按下/弹起事件写脚本
点击不同颜色的圆,将从机状态发送到主机显示
每个颜色都有一大一小颜色相同的两个圆,,小圆表示未选中,大圆表示选中状态
点击红色圆,发送对应数据给主机,此时大圆显示,小圆隐藏,其他颜色大圆隐藏小圆显示
//发送红色的状态给主机 0x03 红色 0x02 绿色 0x01 蓝色
arr2.valbs[2]=0x03;//红色
uartSendBytes(arr2.valbs,0,4); //发送协议数据
ellipse_red_big.visible=1;//显示红色大圆
ellipse_green_big.visible=0;//隐藏绿色大圆
ellipse_blue_big.visible=0;//隐藏蓝色大圆
点击绿色圆,发送对应数据给主机,此时大圆显示,小圆隐藏,其他颜色大圆隐藏小圆显示
//发送红色的状态给主机 0x03 红色 0x02 绿色 0x01 蓝色
arr2.valbs[2]=0x02;//绿色 green
uartSendBytes(arr2.valbs,0,4); //发送协议数据
ellipse_green_big.visible=1;//显示绿色大圆
ellipse_red_big.visible=0;//隐藏红色大圆
ellipse_blue_big.visible=0;//隐藏蓝色大圆
点击蓝色圆,发送对应数据给主机,此时大圆显示,小圆隐藏,其他颜色大圆隐藏小圆显示
//发送红色的状态给主机 0x03 红色 0x02 绿色 0x01 蓝色
arr2.valbs[2]=0x01;//蓝色 blue
uartSendBytes(arr2.valbs,0,4); //发送协议数据
ellipse_blue_big.visible=1;//显示蓝色大圆
ellipse_red_big.visible=0;//取消显示红色大圆
ellipse_green_big.visible=0;//取消显示绿色大圆
5.2.3. 协议解析器,自定义协议解析从站接收的数据
自定义协议控件可以接收发送给本机的数据。
判断帧头是否给本实验所作的协议的帧头。
判断主机发来的数据接收对象是否为本机。
根据主机发送来的数据,设置本机的系统亮度
接收数据是个16进制的固定长度的数组,接收到的数据,为左对齐的格式,属性为rxBuf。rxBuf[0],为数据的第1个字节,rxBuf[1],为数据的第2个字节,以此类推。
自定义协议数据接收事件的脚本如下:
//帧格式:帧头(固定为:0x0a)+从机地址(byte)+数据位(byte)+帧尾(固定为0x0b)
//从机1地址:0x01
//从机2地址:0x02
//从机3地址:0x03
if(protocol1.rxBuf[0]==0x0a&&protocol1.rxBuf[1]==0x01)
//确认帧头是否正确,以及地址是否为本机地址
{
sys_light=(int)protocol1.rxBuf[2];//设置背光亮度为主机发来的亮度。
}
5.3. 实验结果
(1) 主机主机滑块滑动,从机亮度相应改变
(2) 从机点击不同颜色圆,主站表示状态的圆的颜色随之改变