本帖最后由 jinglixixi 于 2021-10-8 12:06 编辑
#申请原创#
MicroLab是一款多功能的工具软件,可以用来进行串口监听、网络监听及组态画布等功能。这里主要介绍的是其组态画布功能,使用它可以多种组件的方式来显示数据检测值,其界面如图1所示。
图1 界面及组件形式
1. 显示组件 显示组件主要包括进度球、电池、仪表盘、刻度计及数码管等, 作为组态画布其功能就是设计显示界面,见图2所示。 但要驱动这些组件,则是下位机的事,要想直接在上位机进行测试验证是较困难的。
图2界面设计
2. 组件驱动协议 作为下位机它是如何来驱动显示组件的呢? 它要对显示的数据进行封装,才能驱动相应的显示组件,而这种封装则是遵守一定的协议。 以驱动进度球为例,其封装的语句为: updateCanvas(WATERLEVER,0, (char *)&x, sizeof(float)); 其中: “WATERLEVER”是组件的类型,“0”是此类组件的序号,X是显示的数值,sizeof(float)则是显示数据的字节长度。 对应的updateCanvas()函数为: void updateCanvas(COMPONENT_TYPEcomponenttype, unsigned short componentnumber, char * data, unsigned shortdatalen)
{
static char tbuffer[TBUFFERSIZE];
static short size;
packProtocol(ORGANIZATION, SECTION, DATAPOINT, componenttype, componentnumber,NONE_MSG, data, datalen, tbuffer, &size);
sendBytes(tbuffer, size);
}
由此可以发现,完成协议处理的核心是packProtocol()函数。
以驱动进度球显示57%的状态为例,其封装后的HEX码为: 58 5A 10 00 00 00 00 00 00 E9 03 00 00 04 00 00 0064 42 58
其中: “585A”是HEAD值,“10”是VERSION值,第一组“00 00”是ORGANIZATION值,第二组“00 00”是ORGANIZATION值,第三组“00 00”是DATAPOINT值,“E9 03”是COMPONENTTYPE值,第四组“00 00”是COMPONENTNUMBER值, “04 00”是msglen值,“00 00 64 42”是数据值,“58”是CRC校验值。 在这里,除了COMPONENTTYPE、COMPONENTNUMBER、CRC及数据值是变量外,其它基本都是固定值。而CRC校验值,则是除校验数据外各项数据的字节和。 让人难以直接看懂的是数据值,与通常所用的数据类型不同,该数据值所用的数据类型为浮点型,且高字节在后。例如57的浮点数为42 64 00 00。
3.测试验证 为了便于在没有下位机的情况下进行验证,可采用如下的操作来进行。 1)选取USB转串口模块,将发送端TX与接收端RX相短接,并插接到电脑上; 2)使用MicroLab的串口监听功能,将接收与发送模式设置为“HEX”类型,见图3所示;
图3 设置收发模式 3)按图4所示执行“RUN”选项,使组件画布处于运行状态;
图4 运行组件画布 4)按图5所示在发送区输入发送内容,然后点击“发送”即可见到预期的执行效果。
图5 方式指令
4 .K32W061驱动组件 K32W061开发板是一款体型小巧的开发板并支持无线通信功能,其外观如图6所示,为了便于功能扩展,可配合扩展板来使用,并支持Arduino接口。
图6 K32W061开发板
该开发板的功能结构框图见图7所示。
图7 功能结构框图
图8所示的组态画布用K32W061开发板驱动的主程序为:
图8 组态画布设计
此外,还需对文件canvas.c进行修改: 1)添加头文件 #include "fsl_debug_console.h" 2)将函数updateCanvas()修改为: void updateCanvas(COMPONENT_TYPE componenttype, unsigned short componentnumber, char * data, unsigned short datalen)
{
static char tbuffer[TBUFFERSIZE];
static short size;
char i;
packProtocol(ORGANIZATION, SECTION, DATAPOINT, componenttype, componentnumber, NONE_MSG, data, datalen, tbuffer, &size);
i=0;
while (i<size)
{
PUTCHAR(tbuffer[i]);
i++;
}
}
在使用K32W061片内A/D转换器的情况下,通过连接土壤湿度传感器可获得土壤的湿度状态,见图9所示。 图9 检测湿度状态
此外,连接数字式传感器的情况下,如DHT22、BH1750、BMP085等,则可进行环境温湿度、光照强度及大气压的检测,进而驱动相应的显示组件来实现界面化的显示效果,见图10所示。
图10 环境状态的组件化显示
5.简化驱动的方法 采用数组的方式将指令的固定值存入其中,然后按所用组件、序号、CRC及数据值的不同加以替代即可,从而除去复杂的协议封装过程,进而提高处理的效率。此外,也更便于将它移植到其它的开发板来驱动。 指令数组的初始定义为: char zl[]={0X58,0X5A,0X10,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X00,0X04,0X00,0X00,0X00,0X00,0X00,0X00}; CRC的初始值为C9,在此基础上再添加相应的字节数据即可获得指令码。
|