您的位置 首页 厂商

Matlab环境下PC与单片机的串行通讯及数据处理

摘要:结合单片机和Matlab两者的优点,基于事件驱动的中断通信机制,提出一种Matlab环境下PC机与单片机实时串行通信及数据处理的方法;完成单片机数据采集系统与PC机的RS-232/RS-485串

摘要:结合单片机Matlab两者的长处,依据事情驱动的间断通讯机制,提出一种Matlab环境下PC机与单片机实时串行通讯及数据处理的办法;完结单片机数据收集体系与PC机的RS-232/RS-485串行通讯及其通讯数据的剖析处理、文件存储、FIR滤涉及图形显现;简化体系开发流程,进步开发功率。该办法已成功运用于一个PIC16F876单片机运用体系实例之中。 关键词:PIC16F876 Matlab 串口通讯 RS-232 事情驱动 回调函数 导言 Matlab是由美国Mathworks公司开发的面向理论剖析研究、工程核算数据处理弛缓图的一套具有强壮功用的软件体系。其间Matlab言语是一种以矩阵为根本运算单元的解说履行的高档言语,编程简例,只需几条句子就能完结比如FFT改换、FIR/IIR滤波等数据剖析处理,易于把握。从 Matlab6.0版别开端,Mathworks公司在软件中添加了设备操控箱(instrument control toolbox),供给了对RS-232/RS-485通讯规范的串口通讯的正式支撑。运用该工具箱的serial类及instrcallback()回调函数,能牢靠地进行实时串地通讯。为此,笔者充沛结合单片机和Matlab的长处,依据事情驱动的间断通讯机制,提出了一种Matlab环境下PC机与单片机实时串行通讯的数据处理办法,极大地简化开发流程,进步了体系开发功率。别的,与现在遍及选用的依据Matlab查询办法下的非实时串行通讯技能比较,这种办法的实用性也大大增强了。

1.png

1 体系总体规划简介 下面以Mircochip公司的PIC16F876单片机为下位机,PC机为上位机组成的实时数据收集处理体系为例,介绍依据Matlab环境下PC机与单片机串行通讯的实时数据处理办法的完结。数据收集体系的结构框图如图1所示。PC机串口与单片机USART口通过MAX232电平转化芯片相连,体系作业时,Matlab通过调用设备操控工具箱中的serial类及相关函数。来创立串口设备方针,得到设备的文件句柄,从而以操作文件的办法完结对PC机串行口的读写操作。因而PC机能够通过Matlab向串行口发送特别指令,PIC单片机运用体系对此作出相应的反响,将A/D采样数据通过串行口回送给PC 机。此刻,Matlab通过间断的办法,实时接纳单片机发送的数据,并完结对数据的剖析处理、文件存储、FIR滤涉及图形显现。 2 PIC16F876与PC机串行通讯接口的规划 2.1 PIC16F876单片机串行通讯接口的硬件规划 PIC16F876微处理器芯片内部集成了一个串行通讯(SCI)模块。该模块是一个通用的同步/异步收发(USART)通讯接口。 图2 PIC16F876的SCI通讯接口有两个外部引脚——RC6/TX(SCI发送输出引脚)和RC7/RX(SCI接纳输入引脚),引脚的信号电平为 TTL类型;而PC机串口的异步串行通讯依据RS232规范。两者通讯信号的逻辑电平不一致,有必要进行信号电平转化。为此,在电路中选用Maxim公司的 MAX232芯片,以完结TTL电平与RS-232电平的双向转化。RS-232通讯距离一般以不超越12m为宜,在工业操控现场很受约束。为确保硬件规划的兼容性和易扩展性,能够运用于不同场合,考虑到实践运用的需求,在硬件电路中还可选用一个MAX491芯片,添加了一个RS-485通讯接口。 如图2所示,实践运用过程中,体系能够依据需求,灵敏运用不同的通讯规范,非常便利。当PIC单片机SCI通讯接口引脚直接通过MAX232芯片与PC机串口相连时,体系选用RS-232的通讯规范;当PIC单片机SCI通讯接口口引脚与MAX489芯片的DI、RO引脚相连时,体系选用RS-485的通讯规范。别的,还可通过PIC单片机操控MAX489芯片的DE、RE引脚,随时使能或屏蔽掉MAX489的数据接纳和数据发送功用。 2.2 PIC16F876与PC机串行通讯接口的软件规划 本通讯体系中规则的字符格局为:每一帧的数据占10位——1位开始位,8位数据位,1位间断位,无奇偶校验位。中心的8位数据位即为有用的通讯传输字节。两边的波特率设置为115.2kb/s,以较高速度进行通讯。一起,为了增强通讯的牢靠性、削减通讯的误码率,在通讯过程中约好了两边的软件握手办法。为了不致使通讯过于杂乱,进步通讯速度,能够直接将握手信号0xFF嵌入到数据包中。软件握手协议规则如下:PC机发送契合握手信号0xFF给单片机,PIC单片机接纳到的上位机数据若为握手信号0xFF,则回送两次A/D采样数据包,并将握手信号0xFF嵌入到数据包作为第一个数据,两次发送数据的时刻距离为5ms;单片机接纳到的上位机数据若不是握手信号,则持续等候。若PC机接纳到的数据包的第1个字节不是0xFF,则摈弃该数据包;若是,则表明握手成功,经校验正确后将该数据包直接存储接纳,并从中分化有用的A/D采样数据信息。 PIC16F876端串行通讯的C言语程序流程如图3所示,相应的首要通讯源代码如下: //串口相关寄存器的初始化子程序 void sci_initial(){ SPBRG=0C0A; //设置通讯波特率为115.2kb/s TXSTA=0X04; //挑选异步高速通讯形式 RCSTA=0x80; //串行口使能,接纳数据长度为8位,无奇偶校验 TRISC6=0; //RC6引脚设置为输出办法 TRISC7=1; //PC7引脚设置为输入办法 } //串口接纳和发送数据子程序 void sci_com(){ while(!RCIF); //查询接纳间断标志位,等候上位机发送的串口数据 rec_data[0]=RCREG;//接纳串口数据

2.png

if(rec_data[0]==0xFF){ send_data[0]=rec_data[0]; //在第1组数据中嵌入回送握手数据0xFF for(j=0;j33;j++){ TXREG=send_data[j]; //发送第1组32字节的A/D 转化数据,包含握手信号0xFF为33个字节数据 while(!TXIF); //查询发送标志位,等候数据发送结束再进行下一次数据发送 } delay_ms(5); //PIC单片机守时5ms发送第2组A/D转化数据 send1_data[0]=rec_data[0]; //在第2组数据中嵌入回送握手数据0xFF for(j=0;j33;j++){ TXREG=send1_data[j];//发送第2组32个字节A/D转化数据及握手信号数据 While(!TXIF); //查询发送标志位,等候数据发送结束再进行下一次数据发送 } } } 3 Matlab环境下PC机与单片机的通讯 在Matlab6.0中新增的设备操控工具条(instrument control toolbox)用来担任上、下位机之间的通讯。该设备操控工具箱的特征如下: ①支撑依据串行接口(RS-232、RS-422、RS-485)、GPIB总线(IEEE2488、HPIB规范)、VISA总线的通讯; ②通讯数据支撑二进制和文本(ASCII)两种办法,文本办法支撑SCPI(Standard Commands for Programmable Instruments)言语; ③支撑异步通讯和同步通讯; ④支撑依据事情驱动的通讯。 从以上的Matlab设备操控工具箱的特色能够看到,Matlab完全能够满意咱们完结串行通讯的要求。 3.1 Matlab对串行口操控的基础知识 Matlab对串行口的编程操控首要分为四个过程。 ①创立串口设备方针并设置其特点。 scom=serial(com1);%创立串口1的设备方针scom scom.Terminator=CR;%设置终止符为CR(回车符),缺省为LF(换行符) scom.InputBufferSize=1024;%输入缓冲区为256B,缺省值为512B scom.OutputBufferSize=1024;%输出缓冲区为256B,缺省值为512B scom.Timeout=0.5;%Y设置一次读或写操作的最大完结时刻为0.5s,缺省值为10s s.ReadAsyncMode=continuous(缺省办法);%在异步通讯形式办法下,读取串口数据选用接衔接纳数据 (continuous)的缺省办法,那么下位机回来的数据会主动地存入输入缓冲区中. 留意:在些特点只要在方针没有被翻开时才干改动其值,如InputBufferSize、OutputBufferSize特点等。关于一个RS- 232/RS-422/RS-485串口设备方针,其特点的缺省值为波特率9 600b/s,异步办法,通讯数据格局为8位数据位,无奇偶校验位,1位间断位。假如要设置的串口设置方针的特点值与缺省值的特点值相同,用户能够不必另行设置。 别的,设置串口设置方针的特点也能够用一条指令完结,如:scom=serial(COM1,BaudRate,38400,Parity,none,DataBits,8,StopBits,1)。也能够用set指令,如set(scom,BaudRate,19200,Parity,even)。创立了方针后能够在Matlab指令窗口直接敲方针名并回车,看到其根本特点和当时状况。若需求知道其悉数的特点,能够用get(scom)指令。 ②翻开串口设备方针。 fopen(scom); ③读写串口操作。初始化并翻开串口调协方针之后,现在能够对串口设备方针进行读写操作,串口的读写操作支撑二进制和文本(ASCII)两种办法。当 Matlab通讯数据选用西方(ASCII)办法时,读写串口设备的指令分别是fscanf、fpritf;当Matlab通讯数据选用二进制办法时,读写串口设备的指令分别是fread、fwrite。下面以文本办法读写串口为例: a.读串口。A=fscanf(scom,%d,[10,100];%从串口设备方针scom中读入10*100个数据填充到数组A[10,100] 中,并以整型的数据格局寄存。

3.png

h.写串口。Fprintf(scom,%s,RS232,async);%将字符串‘RS232?’以字符的数据格局写入到串口设备 scom,写操作以异步的办法进行。 ④封闭并铲除设备方针。 fclose(scom);%封闭串口设备方针 delete(scom);%删去内存中的串口设备方针 clear scom; %铲除作业空间中的串口设备方针 当不再运用该串口设备方针时,次序运用以上3条指令,能够将所创立的串口方针方针铲除,避免占用体系资源。 能够看出,在Matlab中进行串行通讯是非常便利的,编程较为简略。并且,在Matlab中串行通讯的失误率很低,通讯较为牢靠,也能够选用添加握手信号以及数据校验等的办法进一步添加通讯的牢靠性。 3.2 Matlab完结串行通讯的软件规划 在Matlab环境下,读取串口数据的办法能够分为两种—查询和间断。以查询的办法进行串行通讯时,如下位单片机有很多的数据分时分批传送给PC机,就需求不断查询串行口的缓冲区,有数据就读取;尽管编程简略,但这样做不能对数据进行实时处理,体系实时性不高,并且会极大地占用体系的资源。以间断的办法对串口进行操控完结串行通讯,就能够实时处理下位机传送的数据;但编程相对杂乱一些,需求选用Matlab的事情和回调函数机制。 (1)依据Matlab查询办法的异步串行通讯编程 Matlab查询办法的串行通讯编程尽管简略,但这种办法在实践运用中实用价值不高,下面只作简略介绍。通讯源程序如下: clc;%初始化串口设备方针,设置串口特点为:PC机com2口,输入缓冲区为1024,读写最大完结时刻为0.6s,波特率为115 200b/s,1位间断位,遇到换行符间断,硬件流操控 g=serial(com2); g.InputBufferSize=4096; g.timeout=0.6; g.BaudRate=115200; g.Parity=none; g.StopBits=1; g.Terminator=LF; g.FlowControl=hardware; fopen(g);%翻开串口设备方针s fwrite(g,255);%以二进制的办法发送握手信号0xFF,缺省为异步通讯办法 out=fread(g,33,uint8)%接纳单片机发送的33个数据(8位),并存入out数组中 %开释串口设备方针 fclose(g); delete(g); clear g; (2)依据Matlab间断办法的实时串行通讯编程 在Matlab环境下以间断的办法进行串行通讯,实践上是选用事情驱动的办法完结的。Matlab供给了 instrcallback(obj,event)回调函数,用户依据需求能够自行设置详细的串行通讯事情。Matlab常用的串行口通讯间断事情有:缓冲区有指定字节数意图数据可用事情(bytes-available event)、串口接纳到的数据长时刻处于非激活状况事情(break-interrupt event)、串行口引脚状况改动事情(pin-status event)、输出缓冲区为空事情(output empty event)等。当串口上有监督的事情产生时,Matlab会主动调用回调函数进行通讯事情的处理。因而,事情驱动实质上是一种间断机制,而回调函数实质上相当于一个间断服务子程序。Matlab端实时串行通讯的程序流程如图4所示。以下是详细的编程过程。 ①树立一个串行通讯主程序:serial.m文件,在主程序中进行串口设备初始化操作,并指定回调函数中串行通讯的事情。 程序首要源代码如下(创立串口设备方针、设备串口设备特点及翻开串口等初始化操作的代码与前述的查询办法下的初始化代码相同): %设置回调函数触发事情—当串口缓冲区中有33字节的数据时,触发间断事情,尔后主程序主动调用instrcallback(obj,event)回调函数 g.BytesAvaibleFcnMode=byte;%间断触发事情为‘bytes-available Event’ g.BytesAvailableFcnCount=33;%接纳缓冲区每收到33个字节时,触发回调函数 g.BytesAvailableFcn=@instrcallback;%得到回调函数句柄 fopen(g);%衔接串口设备方针 fwrite(g,255);%写串口,发送握手信号0xFF(等价于十进制下的数值255) ②修正instrcallback(obj,event)回调函数,对所产生的串口通讯事情进行处理。 Matlab缺省的回调函数instrcallback(obj,event)存在于instrcallback.m文件中。该文件实践上是一个有待于用户修正的程序模块。其间只要一些最根本的程序代码,能够显现导致串口间断产生的是哪一类事情,间断事情所产生的时刻以及导致事情产生的方针名等信息(修正回调函数文件时,留意要撤销文件中相应信息后的分号,才干够在Matlab的指令窗口(command window)中将这些信息显现出来)。间断产生后的通讯事情处理以及通讯数据的剖析处理使命,需求用户自行添加相应的服务程序代码。

4.png

Matlab装置方针下有两个instrcallback.m文件,咱们只需求修正@instrument目录下的instrcallback.m文件即可。当然,在修正instrcallback.m文件之前,最好对其做一个备份。别的,需求留意的是:程序调试过程中假如再次修正了该回调函数,要重新启动Matlab装备该文件,才干使得新的回调函数文件收效。 修正后的instrcallback.m文件见网站www.dpj.com.cn。该修正后的回调函数能够完结如下使命: ①实时接纳单片机实时5ms发送的33个串行通讯数据,其间包含1个握手信号和32个A/D转化数据(这些数据是PIC单片机体系收集到的传感器信号,每个数据占1字节),并存储在out数组中; ②对接纳到的数据进行处理,因为PIC单片机的A/D转化值为10位,占2字节,而单片机每次只能传送1个字节的数据,故将收到的每两个通讯数据整合成为 1个实在的A/D转化数据,共16个A/D转化数据,并存储在Dataout数组中; ③将接纳到的串口数据存储到serialdata.txt文件中,将整合后的单片机A/D转化数据存储到一个以间断事情产生的时刻为文件名的txt文件中; ④依据A/D转化数据,运用Matlab求其最大值、最小值平和均值,并运用FIR滤波器对传感器信号A/D转化值作FIR滤波处理,得到窗格为5的滑动滤波平均值; ⑤运用Matlab中的plot()函数实时制作单片机收集到的传感器信号的原始波形图和FIR滤波后波形图,如图5所示,能够看到通过FIR滤波后的传感器动态信号值较为安稳,精度大幅进步。 试验证明,依据Matlab间断办法的PC机与单片机的实时串行通讯安稳牢靠,处理数据便利,编程简略,开发功率大大进步。 4 定论 本文介绍的依据Matlab环境下PC机与P%&&&&&%单片机串行通讯的完结办法,运用Matlab的Instrument Control Tollbox的serial类及instrcallback()回调函数,完结依据事情驱动的实时刻断通讯。使开发人员能够充沛运用Matlab工具箱中的现有函数,便利地完结串行通讯、数据剖析处理和图形显现,大大简化体系上位机软件的编程作业量。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/294463.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部