发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
[M4]

K32W061开发板驱动MicroLab显示组件

[复制链接]
5826|0
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2021-10-8 11:23 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2021-10-8 12:06 编辑

#申请原创#
MicroLab是一款多功能的工具软件,可以用来进行串口监听、网络监听及组态画布等功能。这里主要介绍的是其组态画布功能,使用它可以多种组件的方式来显示数据检测值,其界面如图1所示。
1.jpg
图1 界面及组件形式

1. 显示组件
显示组件主要包括进度球、电池、仪表盘、刻度计及数码管等, 作为组态画布其功能就是设计显示界面,见图2所示。
但要驱动这些组件,则是下位机的事,要想直接在上位机进行测试验证是较困难的。
2.jpg
图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
a.jpg
其中:
“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.jpg
图3 设置收发模式
3)按图4所示执行“RUN”选项,使组件画布处于运行状态;
4.jpg
图4 运行组件画布
4)按图5所示在发送区输入发送内容,然后点击“发送”即可见到预期的执行效果。
5.jpg
图5 方式指令

4 .K32W061驱动组件
K32W061开发板是一款体型小巧的开发板并支持无线通信功能,其外观如图6所示,为了便于功能扩展,可配合扩展板来使用,并支持Arduino接口。
6.jpg
图6 K32W061开发板

该开发板的功能结构框图见图7所示。
7.jpg
图7 功能结构框图

图8所示的组态画布用K32W061开发板驱动的主程序为:
b.jpg

8.jpg
图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.jpg                               
图9 检测湿度状态

此外,连接数字式传感器的情况下,如DHT22、BH1750、BMP085等,则可进行环境温湿度、光照强度及大气压的检测,进而驱动相应的显示组件来实现界面化的显示效果,见图10所示。
10.jpg
图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,在此基础上再添加相应的字节数据即可获得指令码。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2022-01-07
理由:恭喜通过原创文章审核!请多多加油哦!

相关帖子

发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则