实验17 485组网

1. 实验目的

  1. 使用自定义协议,通过485接口,完成设备间通讯。

  2. 一个主站与三个从从站之间通讯。

2. 实验设计

  1. 主站控制三个从站的背光亮度。

  2. 主站接收从站的状态,并显示在主站上。

3. 硬件连接方式

  1. 一个主机和三个从机,都是用485接口的串口屏。

  2. 制作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. 当滑动滑块时,会产生值改变事件和滑块值(1-100)的变化

  2. 通过值改变事件的脚本,发送滑块的滑动值给从机。

  3. 从机接收到滑动值,把背光亮度的级别设置为滑动值,就能改变背光亮度。

  4. 滑块值改变事件脚本如下:

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. 自定义协议-数据接收事件

  1. 自定义协议控件可以接收发送给本机的数据。

  2. 判断帧头是否给本实验所作的协议的帧头。

  3. 判断是哪个从机发来的数据。

  4. 判断从机的状态,改变代表从机的圆形的颜色,和从机一致。

  5. 自定义协议接收数据是个16进制的固定长度的数组,接收到的数据,为左对齐的格式,属性为rxBuf。rxBuf[0],为数据的第1个字节,rxBuf[1],为数据的第2个字节,以此类推。

  6. 自定义协议数据接收事件的脚本如下:

/*
接收从机的数据,设置从机的状态,状态用颜色来标记:红,绿,蓝。

从机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背光亮度的滑块,从机1背光亮度根据滑块的动作,进行明暗变换。

  2. 滑动其他其他从机的滑块,相应从机会进行相应的明暗变换。

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. 触摸热区发送从机状态到主机显示

  1. 每个圆上覆盖一个触摸热区,在热区的按下/弹起事件写脚本

  2. 点击不同颜色的圆,将从机状态发送到主机显示

  3. 每个颜色都有一大一小颜色相同的两个圆,,小圆表示未选中,大圆表示选中状态

  4. 点击红色圆,发送对应数据给主机,此时大圆显示,小圆隐藏,其他颜色大圆隐藏小圆显示

//发送红色的状态给主机 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;//隐藏蓝色大圆
  1. 点击绿色圆,发送对应数据给主机,此时大圆显示,小圆隐藏,其他颜色大圆隐藏小圆显示

//发送红色的状态给主机 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;//隐藏蓝色大圆
  1. 点击蓝色圆,发送对应数据给主机,此时大圆显示,小圆隐藏,其他颜色大圆隐藏小圆显示

//发送红色的状态给主机 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. 协议解析器,自定义协议解析从站接收的数据

  1. 自定义协议控件可以接收发送给本机的数据。

  2. 判断帧头是否给本实验所作的协议的帧头。

  3. 判断主机发来的数据接收对象是否为本机。

  4. 根据主机发送来的数据,设置本机的系统亮度

  5. 接收数据是个16进制的固定长度的数组,接收到的数据,为左对齐的格式,属性为rxBuf。rxBuf[0],为数据的第1个字节,rxBuf[1],为数据的第2个字节,以此类推。

  6. 自定义协议数据接收事件的脚本如下:

//帧格式:帧头(固定为: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) 从机点击不同颜色圆,主站表示状态的圆的颜色随之改变