与气体质量流量控制器通讯
气体质量流量控制器,简称MFC,通常用于在各种检测中,计量气体的流量。在我们的大气环境数据采集站中,要让气流保持稳定,这样才能准确的获取PM25的数据。
我们采用的气体质量流量控制器具备串口通讯功能,采集流量信号并更具设定数据自动调节流量。我们采用的质量流量控制器如下:
1、协议描述
该类型的质量流量控制器采用RS232 ASCII通讯协议,协议的格式非常简单,如下图所示:
其中,:是起始字符。len1, len2 是指包括节点地址在内的信息的字节数长度, 即基本信息的长度+1。node1, node2是目标设备的节点地址。data1, data2,具体信息。CR是结束字符。
除了起始字符和结束字符外,其他的全部字节都会按1个字节转化为2个16进制表示的ASCII码字符。如:0x2A会被转化为0x32和0x41两个ASCII码字符。
对于发送错误信息的报文有一定的区别,如下图:
其长度是固定的,与正确状态下的信息格式略有差别。
2、硬件设计
因为采用的是串口通讯,所以硬件的连接比较简单。麒麟座上的USART1(PA9:USART1_TX,PA10:USART1_RX)端口已经引到了J2端子排的J2_6和J2_5,所以我们就是用这一接口。如下图所示:
但是由于OneNET麒麟座山是TTL电平,而质量流量控制器是RS232的接口,所以我们还需要一个用于电平转换的摸块,我们平时就是使用一种如下图的TLL转RS232的接口模块,这次也使用它。
至此,硬件连接就不会有问题了。
3、软件设计
接下来我们看看软件方面的设计,在开始具体的软件设计之前,我们看一看流量控制器中具体的参数存储地址和没操作命令。
(1)操作命令
命令字符串是以ASCII码表示的二进制字符串。质量流量控制器具有9种命令,我们并不需要用到其中的全部命令,具体如下图所示:
(2)数据类型与地址
该种类型的气体质量流量计拥有将近300个参数可供读或者写,但我们通常用不到这么多,我们只考虑其中的几个参数:
? 流量测量值,地址为205,浮点类型。
? 流量设定值,地址为206,浮点类型。
? IO状态,地址为86,字节型数据。
? 控制模式,地址为12,字节型数据。
气体质量流量控制器的参数数据类型有5种,分别为:字符型、整型、浮点型、长整型以及字符型,如下图:
有了以上这些准备我们就可以开始编写程序了。首先我们编写一个串口发送数据的通用函数:
//数据发送
void SendData(uint8_t *txData,uint16_t length)
{
uint16_ti;
for(i=0;i<length;i++)
{
//传送寄存器不为空,等待传送结束
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
// 写一个字节到对应的串口传送数据寄存器
USART_SendData(USART1, txData);
}
}
(3)读取状态信息
我们之所以要单独对状态信息编写操作程序,是因为它的报文格式与读取其他参数有一定的区别,如下图:
/*获取状态*/
void GetMFCStatus(uint8_t status,uint8_t index)
{
uint8_t txBuf[8];
txBuf[0]=':';
txBuf[1]=0x04;
txBuf[2]=0x0A;
txBuf[3]=0x00;
txBuf[4]=status;
txBuf[5]=index
txBuf[6]=0x0D;
txBuf[7]=0x0A;
SendData(txBuf,8);
}
(4)写数据
接下来我们来看看如何写数据,主要用于设置各种参数值,对于我们来说设置流量设定值是必须的,具体报文格式如下:
/*读取参数值*/
void SetMFCParaValue(uint8_t *data,uint16_tlength,uint8_t command,uint8_t processNum,uint8_t paraType)
{
uint8_ttxBuf[20];
uint16_tindex=6;
txBuf[0]=':';
txBuf[1]=0x04+(uint8_t)length;
txBuf[2]=0x0A;
txBuf[3]=command;
txBuf[4]=0x80+processNum;
txBuf[5]=paraType;
for(inti=0;i<length;i++)
{
txBuf[i+6]=data;
}
txBuf[6+length]=0x0D;
txBuf[6+length+1]=0x0A;
SendData(txBuf,length+8);
}
(5)读数据
接下来我们来看看如何读取数据,主要用于获取各种参数值,对于我们来说读取流量测量值是必须的,具体报文格式如下:
/*读取参数值*/
void GetMFCParaValue(uint8_t processNum,uint8_tparaType,uint8_t paraNum,uint8_t strLength)
{
uint8_t txBuf[11];
txBuf[0]=':';
txBuf[1]=0x07;
txBuf[2]=0x0A;
txBuf[3]=0x04;
txBuf[4]=0x80+processNum;
txBuf[5]=paraType;
txBuf[6]=processNum&0x7F;
txBuf[7]=paraNum;
txBuf[8]=strLength;
txBuf[9]=0x0D;
txBuf[10]=0x0A;
SendData(txBuf,11);
}
4、结果展示
我们在完成上述编写后编译下装,并上传到OneNET查看最后的显示结果如何。显示数据更新正确,如下图:
至此,我们完成了读取气体质量流量控制器的数据测试。