Protocol Buffers在数据采集与传输系统建设方式论文
第1篇:Protocol Buffers在数据采集与传输系统建设方式论文
Protocol Buffers在数据采集与传输系统建设方式论文
随着通信技术和传感器技术的不断发展,数据采集与传输系统得到了越来越广泛的应用。而Google Protocol Buffers是Google公司开发是一款非常优秀的库,其定义了紧凑的、可扩展的二进制消息格式,特别适合用于数据传输。本文着重介绍了使用Protocol Buffers的对数据的封装和其反射机制来实现数据采集与传输系统的快速扩展采集数据类型。
1 Protocol Buffers概述
1.1 简介
Protocol Buffers(以下简称ProtoBuf)是由Google开发的一种数据描述语言。ProtoBuf定义了一种紧凑的可扩展二进制消息格式,能对结构化的数据进行灵活的、高效的、自动的机制来进行序列化。ProtoBuf可扩展方式的序列化结构数据被广泛应用在通信协议、数据存储等领域。
1.2 ProtoBuf的性能
一条消息数据,用ProtoBuf序列化后的大小是JSON的十分之一,是XML格式的二十分之一,是二进制序列化的十分之一。总体看来ProtoBuf的优势还是非常明显的。
2 应用在数据采集与传输系统中
这里所设计的数据采集与传输系统采用Slave-Master结构。其中Slave负责采集数据并将数据发送给Master;Master接收所采集的数据并做进一步处理。Slave可以支持多种数据类型(如GPS、图像等)的采集。
2.1 根据不同的采集数据类型,编写proto文件
在ProtoBuf中,所有的对象都被视为消息。消息的每个属性描述都可以使用required、optional、repeated来进行描述。ProtoBuf数据描述语言中也支持一些基本的数据类型如string、int32、double等等。
设Slave的采集数据类型有Type1、Type2。这两种类型的Proto描述命名为MsgType1和MsgType2(图1所示)。
经proto编译后,生成的消息类为MsgType1和MsgType2,它们均继承自google::protobuf::Message类。
2.2 设计支持不同采集数据类型的数据传输格式
在数据传输中使用ProtoBuf需要解决两个问题,一是数据的长度:ProtoBuf打包的数据没有自带长度信息或终结符,这就需要由应用程序自己在发生和接收的时候做正确的分割;二是消息类型:ProtoBuf打包的数据没有自带的类型信息,在消息传输过程中,发送方需要将消息类型告诉接收方,接收方根据消息类型再做反序列化。对于长度问题,可以将长度信息作为消息的一个段来解决。而对于消息类型问题,可以使用ProtoBuf根据消息的类型名反射自动创建对应的消息对象的机制来解决。因此,可以设计基本传输格式的格式如图2所示:
ProtoBuf Message的序列化数据封装在message_data中,且称这种数据格式为Message Package(消息包)。
2.3 消息打包器的设计
消息包格式设计完后,首先要对不同的采集数据类型编写封装函数,以便将相应类型的数据封装到对应的ProtoBuf Message中。然后使用消息打包器将Slave所采集的某种类型的数据信息打包成上图的消息包。消息打包器先通过ProtoBuf将特定类型的采集数据进行序列化,并生填充Message Data。最后再填充Message Package中的Length 、Message Name等字段,完成消息的打包操作。消息打包器代码如下:
std::string CreateMsgPackage( const google::protobuf::Message& msg )
{
std::string msg_pack;
msg_pack.resize( sizeof( int32_t ) );
string& msg_name = msg.GetTypeName();
int32_t name_len = msg_name.size()+1;
msg_pack.append((char*)&name_len,sizeof(name_len));
msg_pack.append(msg_name.c_str(),name_len);
Msg.AppendToString(&msg_pack);
char* begin = msg_pack.c_str()+sizeof( int32_t );
int32_t length = msg_pack.size()-sizeof(int32_t);
std::copy( (char*)( &length ), (char*)( Length ) +
sizeof( Length ), msg_pack.begin );
return msg_pack;
}
2.4 消息解包器的设计
接收到消息包之后要进行解封装,分解出消息包中的各个字段,这里不再详述。ProtoBuf本身具有很强的反射机制,ProtoBuf可以能根据Message Name创建一个该类型的消息,然后使用Message Data来反序列化该消息,从而在Message Package中恢复出相应类型的Message,由此完成对消息的`识别。由消息包来还原相应的消息的代码如下:
Message* CreateMsg( std::string& msg_pack )
{
// 从msg_pack中分离msg_name、msg_data等的代码从略
Message* msg = NULL;
Descriptor* desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name);
Message* prototype = MessageFactory::generated_factory()->GetPrototype(desc);
msg = prototype->New();
msg->ParseFromArray(msg_data, msg_data_len);
return msg;
}
2.5 消息分发器的设计
Master在得到相应类型的采集数据消息后,需要传递给相应的消息处理方法,这就涉及到消息的分发。消息分发器可以使用map来实现,由于每个具体消息类型都有一个全局的Descriptor对象,其地址是唯一的,可作为key;value为针对特定采集数据类型消息的处理函数,即std::map,其中MessageCallBack为 boost::function。由于消息分发器传给处理函数的参数是Message*类型,处理函数需要对其进行向下转型后才能使用。消息分发器在接收到某一消息后,在map中查找对应的处理函数,并执行该函数。
2.6 整体结构
在Slave端,用户需要使用proto数据描述语言描述该类型的数据,并产生相应的Message类型,此外用户还要编写相应数据类型消息封装方法。在Master端,由于与Slave使用相同的proto文件,消息解包器可以分辨出相应类型的Message。用户在Master端需要编写针对某具体类型采集数据的处理方法,并向消息分发器注册。消息分发器将消息解包器解出的消息作为参数调用对应的处理方法。
3 结束语
在Slave-Master结构的系统中通过编写proto文件来描述各种类型的采集数据;在Slav e端进行采集数据的序列化和封装;在Master端编写对应的采集数据处理方法,并将该方法注册到Master的消息分发器中,完成对采集数据类型的快速扩展。
Protocol Buffers .https://developers.google.com/protocol-buffers/docs/overview.
陈硕.Linux多线程服务端编程——使用muduo C++网络库.北京:电子工业出版社.2013:220-236.
李纪欣,王康,周立法,章军.Google Protobuf在Linux Socket通讯中的应用.电脑开发与应用.2013,26(4).
田源,潘晨光,丁杰.Protocol Buffers在即时通讯系统中的应用研究 .现代电子技术.2013,37(5)
第2篇:数据采集系统设计研究论文
数据采集系统设计研究论文
摘要:针对LabVIEW及MSP430F5529单片机构成的多路数据采集系统研究及设计,分为上位机和下位机两个主要模块来进行阐述。MSP430F5529作为前端数据采集系统进行数据采集,采集到的电压通过串口传到上位机LabVIEW界面。
关键词:MSP430F5529,单片机,数据采集,LabVIEW
LabVIEW程序设计方面相对来说比较简单,但是,Lab-VIEW的使用灵活性和功能完整性也很强大。MSP430F5529单片机多路电压数据采集系统的设计,从结构上来看比较简单,此类单片机工作电压区间比较低,耗能相对较低,内部集成了许多功能模块,功能完整性比较强大。结构简单的单片机系统与LabVIEW上位机的串行通信的功能结合,增加了系统灵活性。同时,又利用了MSP430F5529的超低耗功能,降低成本,使用简便。另外,虚拟仪器除了在物理形式上实现之外,也可以实现系统内的软件、硬件资源共享。将两者结合的多路电压数据采集系统无论是从运行效率还是编程方式,都展现了强大的优势。
1数据采集系统
1.1数据采集系统需求基于LabVIEW及单片机构成的多路电压数据采集系统研究和设计,其中MSP430F5529单片机、ADC转换器组成的下位机数据采集系统实现采集电压的功能;采集到的多路电压信号被发送至LabVIEW程序功能模块进行分析和处理,并显示数据处理的结果;研究电平的转换。下位机的TTL电平转换成上位机能够接收的RS232电平。首先系统进行初始化,然后单片机通过串口进行多路数据采集,打开ADC转换器,开始转换,读取转换结果。然后发送到上位机界面,显示得到的数据处理结果。1.2数据采集系统方案设计的采集系统以上位机数据显示界面和数据采集系统实物的形式呈现,研究上位机与下位机的数据交互机制,实现数据的交互。方案:在上位机与下位机之间需要研究一个电平转换,采用MSP430系列单片机作为下位机采集模块,LabVIEW作为上位机处理模块;两个模块之间加入电平转换模块,采用的是CP2102转换芯片。此方案编程简单且方便,成本也相对较低,从整体来说也比较严谨。系统初始设计时,第一部分设计下位机单片机模块,启动A/D转换,得到的转换结果发送到单片机处理。并且加入了LCD显示模块;第二部分设计上位机LabVIEW程序处理模块,将采集到的结果上传到上位机显示。设计方案的流程图如图1所示。
2下位机采集系统设计此次设计采用
MSP430F5529Launchpad,MSP430F5529开发板内部集成A/D转换模块,多路电压采集系统下位机的重点在于A/D转换,所谓A/D转换即指模拟量等转换为数字量。MSP430F5529单片机可以自定义参考电压,此次设计的参考电压设计的是3.3V。所以本数据采集系统可采集的电压范围是0~3.3V。本设计是采集多路电压,转换的方法模式是采用转换速度较快的序列通道多次转换,提高转换速率。在程序设计里面是用ADC12CONSEQ_3来选择采样模式。同时,定义了ADC12SHP等于1,来定义信号的来源是采样定时器。ADCMEMx存储器用来存储转换结果。此类存储器是CSTARTADDx位定义的。参考电压和通道是需要经过定义才能工作的,一般是通过ADC12MCTLx寄存器。多路电压数据采集的下位机流程图如图2所示。首先执行端口初始化,第一步便是关闭看门狗,在MSP430单片机中,主程序首先要关闭看门狗,如果不关闭看门狗,程序执行一段时间后,可能会导致程序无法运行。因为看门狗有定期重置CPU的功能。然后端口定义,ADC转换和串口通信的工作模式的初始化,之后进入中断采集数据,在有信号输入的时候才会进入中断,如果没有外部电压信号的输入不会进行中段。采集电压信号后开始转换,转换完成之后数据被传送两个方向:一是传送到LCD显示,二是发送到上位机LabVIEW程序界面显示。在AD转换的过程中是进入中断进行数据测量的,此次多路数据采集系统的下位机设计的中断标志位采用ADC12IFG寄存器设置。MSP430单片机的中断可以说是非常大的一个亮点。想要有效提高程序运行的速率,在程序中加入中断便可实现。MSP430单片机的每个片上运行后,CPU便被唤醒,此时低功耗模式是不存在的,中断完成后,CPU脱离唤醒模式。此时的单片机回到低功耗状态。在下位机串口发送方面,U-CA0CTL控制寄存器来定义了时钟源,需要通过相应的时钟源来确定波特率,此控制寄存器的第0位是USCWRST,它具有软件复位的功能,在设计中需要使它置1,那么逻辑将会在复位状态一直保持。第6到7位的UCSSEL,用来选择时钟源,时钟源选择的是AMCLK,那么UCSSEL的状态是01,此时的波特率需要求出相应的分频细数来定义,AMCLK的频率是32768Hz。跟据定义,在低频时钟的'情况下,分频参数是时钟频率与波特率的比重,此次设计的波特率是9600,因此可以得出的是分频参数是3.41,所以,UCA0BR0等于3。
3显示界面上位机设计
3.1上位机LabVIEW设计此次多路电压数据采集系统的上位机LabVIEW程序流程图如图3所示。上位机的部分,首先设计了单路的电压数据采集系统,其程序框图如图4所示。上位机LabVIEW的设计首先是配置串口参数,参数的配置与下位机端要保持一致,参数配置完成后要进入while循环中的VISAREAD,读取从下位机传来的数据。单路数据采集就是直接显示电压。加入while循环的目的是使程序可以一直运行,而且是直接只运行读取缓冲区数据部分,不用每次都配置串口参数,提高了程序运行速率。3.2TTI与RS232电平转换MSP430单片机输出的L电平与上位机接收的电平不是同一种,分别为TTL和RS232。所以上位机与下位机之间需要进行转换,15V~5V指的是RS232电平逻辑1时的状态,而逻辑0的话,是在+5V~+15V,而TTL电平逻辑0在0~0.8V之间,逻辑1在2.4V~5V之间,所以在TTL电平与RS232之间,需要进行正负逻辑的转换。在此次设计中选用的是主要由CP2102转换芯片构成的转换模块。同时里面也集成了MAX2485和MAX232通信芯片。CP2102是一种品质较好,工作比较稳定的且性能强大的转换芯片。整个转换模块体积小,便于移动。此次设计用MSP430F5529专门用于串口发送的P3.3口与RX引脚连接。如图5所示。CP2102的RX引脚专门用来接收TTL电平。CP2102的另一端与电脑相连,打开上位机LabVIEW程序,串口信息配置好之后,便可以显示采集的电压数据。
4多路电压数据采集系统测试
为了便于系统能够成功采集数据,采集的电压采取就近原则,直接采集单片机管脚电压,此次测试三次电压分别为:3.3V电源管脚电压、普通管脚电压(1.78V)以及GND管脚电压(0V)。由于误差作用,系统不能准确测到3.3V,以及3.3V会对旁边线路产生影响,所以第二路电压信号会从1.78V拉高到2.76V,第三路接地,所以是0.00V。除去显示结果以外,增加了波形显示,使采集到的电压变化变得一目了然。此外加入了串口工作灯指示,在串口正常工作的情况下,串口灯是绿色,在串口工作异常的情况下,串口灯是红色。改变某一路电压后,把第三路采集电压的管脚从接地端拔了下来,悬空时的电压是1.78V,同样会被3.3V的电压拉高,电压的变化直接在上位机界面呈现出来,直观明了,如图7所示。波形显示的坐标是可以自动变换的,根据数据的大小智能变换,改变采集管脚的电压后,如图8所示。
5结束语
基于MSP430F5529和LabVIEW进行多路电压数据采集系统,实际应用的结果,下位机与上位机的通信功能正常,操作也非常简单方便,完成了设计之初的要求,可以实现的功能有:①采集三路0V~3.3V的电压;②采集到的电压在LCD屏显示;③采集到的电压上传至LabVIEW上位机数据采集编写模块显示;④上位机LabVIEW界面显示电压数据及电压波形。研究并实现了MSP430F5529单片机的数据采集及处理、ADC转换、TTL电平转RS232电平、上位机与下位机之间的串口通信。同时,此次设计也存在些许不足:①只能采集三路数据;②不能调取历史采集数据。
参考文献
[1]陈美玉.基于单片机及LabVIEW的多路数据采集系统设计[J].企业技术开发,2017,36(1):69-71
[2]王克胜.系统软件设计及控制分析[J].科技与企业,2013(4):81-81
[3]段新燕.单片机液晶显示系统的设计[J].电子科技,2012,25(8):13
[4]周丽,裴东兴.基于MSP430单片机的超低功耗温度采集系统设计[J].电子测试,2011(10):35-38
第3篇:数据采集系统设计研究论文
摘要:针对LabVIEW及MSP430F5529单片机构成的多路数据采集系统研究及设计,分为上位机和下位机两个主要模块来进行阐述。MSP430F5529作为前端数据采集系统进行数据采集,采集到的电压通过串口传到上位机LabVIEW界面。
关键词:MSP430F5529,单片机,数据采集,LabVIEW
LabVIEW程序设计方面相对来说比较简单,但是,Lab-VIEW的使用灵活性和功能完整性也很强大。MSP430F5529单片机多路电压数据采集系统的设计,从结构上来看比较简单,此类单片机工作电压区间比较低,耗能相对较低,内部集成了许多功能模块,功能完整性比较强大。结构简单的单片机系统与LabVIEW上位机的串行通信的功能结合,增加了系统灵活性。同时,又利用了MSP430F5529的超低耗功能,降低成本,使用简便。另外,虚拟仪器除了在物理形式上实现之外,也可以实现系统内的软件、硬件资源共享。将两者结合的多路电压数据采集系统无论是从运行效率还是编程方式,都展现了强大的优势。
1数据采集系统
1.1数据
