SerialcommunicationinMatlabWord下载.docx

上传人:b****6 文档编号:20868406 上传时间:2023-01-26 格式:DOCX 页数:11 大小:514.88KB
下载 相关 举报
SerialcommunicationinMatlabWord下载.docx_第1页
第1页 / 共11页
SerialcommunicationinMatlabWord下载.docx_第2页
第2页 / 共11页
SerialcommunicationinMatlabWord下载.docx_第3页
第3页 / 共11页
SerialcommunicationinMatlabWord下载.docx_第4页
第4页 / 共11页
SerialcommunicationinMatlabWord下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

SerialcommunicationinMatlabWord下载.docx

《SerialcommunicationinMatlabWord下载.docx》由会员分享,可在线阅读,更多相关《SerialcommunicationinMatlabWord下载.docx(11页珍藏版)》请在冰豆网上搜索。

SerialcommunicationinMatlabWord下载.docx

  下面以Mircochip公司的PIC16F876单片机为下位机,PC机为上位机组成的实时数据采集处理系统为例,介绍基于Matlab环境下PC机与单片机串行通信的实时数据处理方法的实现。

数据采集系统的结构框图如图1所示。

PC机串口与单片机USART口通过MAX232电平转换芯片相连,系统工作时,Matlab通过调用设备控制工具箱中的serial类及相关函数。

来创建串口设备对象,得到设备的文件句柄,从而以操作文件的方式实现对PC机串行口的读写操作。

因而PC机可以通过Matlab向串行口发送特殊指令,PIC单片机应用系统对此作出相应的反应,将A/D采样数据通过串行口回送给PC机。

此时,Matlab通过中断的方式,实时接收单片机发送的数据,并完成对数据的分析处理、文件存储、FIR滤波及图形显示。

2PIC16F876与PC机串行通信接口的设计

2.1PIC16F876单片机串行通信接口的硬件设计

  PIC16F876微处理器芯片内部集成了一个串行通信(SCI)模块。

该模块是一个通用的同步/异步收发(USART)通信接口。

  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.2PIC16F876与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所示,相应的主要通信源代码如下:

//串口相关寄存器的初始化子程序

voidsci_initial(){

SPBRG=0C0A;

//设置通信波特率为115.2kb/s

TXSTA=0X04;

//选择异步高速通信模式

RCSTA=0x80;

//串行口使能,接收数据长度为8位,无奇偶校验

TRISC6=0;

//RC6引脚设置为输出方式

TRISC7=1;

//PC7引脚设置为输入方式

}

//串口接收和发送数据子程序

voidsci_com(){

while(!

RCIF);

//查询接收中断标志位,等待上位机发送的串口数据

rec_data[0]=RCREG;

//接收串口数据

if(rec_data[0]==0xFF){

send_data[0]=rec_data[0];

//在第1组数据中嵌入回送握手数据0xFF

for(j=0;

j<

33;

j++){

TXREG=send_data[j];

//发送第1组32字节的A/D

转换数据,包含握手信号0xFF为33个字节数据

TXIF);

//查询发送标志位,等待数据发送完毕再进行下一次数据发送

delay_ms(5);

//PIC单片机定时5ms发送第2组A/D转换数据

send1_data[0]=rec_data[0];

//在第2组数据中嵌入回送握手数据0xFF

TXREG=send1_data[j];

//发送第2组32个字节A/D转换数据及握手信号数据

While(!

3Matlab环境下PC机与单片机的通信

  在Matlab6.0中新增的设备控制工具条(instrumentcontroltoolbox)用来负责上、下位机之间的通信。

该设备控制工具箱的特色如下:

  ①支持基于串行接口(RS-232、RS-422、RS-485)、GPIB总线(IEEE2488、HPIB标准)、VISA总线的通信;

  ②通信数据支持二进制和文本(ASCII)两种方式,文本方式支持SCPI(StandardCommandsforProgrammableInstruments)语言;

  ③支持异步通信和同步通信;

  ④支持基于事件驱动的通信。

  从以上的Matlab设备控制工具箱的特点可以看到,Matlab完全可以满足我们实现串行通信的要求。

3.1Matlab对串行口控制的基础知识

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串口设备对象,其属性的缺省值为波特率9600b/s,异步方式,通信数据格式为8位数据位,无奇偶校验位,1位停止位。

如果要设置的串口设置对象的属性值与缺省值的属性值相同,用户可以不用另行设置。

  另外,设置串口设置对象的属性也可以用一条指令完成,如:

COM1'

'

BaudRate'

38400,'

Parity'

none'

DataBits'

8,'

StopBits'

1)。

也可以用set命令,如set(scom,'

19200,'

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]中,并以整型的数据格式存放。

h.写串口。

Fprintf(scom,'

%s'

RS232'

async'

%将字符串‘RS232?

’以字符的数据格式写入到串口设备scom,写操作以异步的方式进行。

④关闭并清除设备对象。

fclose(scom);

%关闭串口设备对象

delete(scom);

%删除内存中的串口设备对象

clearscom;

%清除工作空间中的串口设备对象

  当不再使用该串口设备对象时,顺序使用以上3条命令,可以将所创建的串口对象对象清除,以免占用系统资源。

  可以看出,在Matlab中进行串行通信是十分方便的,编程较为简单。

而且,在Matlab中串行通信的失误率很低,通信较为可靠,也可以采用增加握手信号以及数据校验等的方式进一步增加通信的可靠性。

3.2Matlab实现串行通信的软件设计

  在Matlab环境下,读取串口数据的方式可以分为两种—查询和中断。

以查询的方式进行串行通信时,如下位单片机有大量的数据分时分批传送给PC机,就需要不停查询串行口的缓冲区,有数据就读取;

虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统的资源。

以中断的方式对串口进行控制实现串行通信,就可以实时处理下位机传送的数据;

但编程相对复杂一些,需要采用Matlab的事件和回调函数机制。

(1)基于Matlab查询方式的异步串行通信编程

  Matlab查询方式的串行通信编程虽然简单,但这种方法在实际应用中实用价值不高,下面只作简单介绍。

通信源程序如下:

  clc;

%初始化串口设备对象,设置串口属性为:

PC机com2口,输入缓冲区为1024,读写最大完成时间为0.6s,波特率为115200b/s,1位停止位,遇到换行符中止,硬件流控制

g=serial('

com2'

g.InputBufferSize=4096;

g.timeout=0.6;

g.BaudRate=115200;

g.Parity='

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);

clearg;

(2)基于Matlab中断方式的实时串行通信编程

在Matlab环境下以中断的方式进行串行通信,实际上是采用事件驱动的方法实现的。

Matlab提供了instrcallback(obj,event)回调函数,用户根据需要可以自行设置具体的串行通信事件。

Matlab常用的串行口通信中断事件有:

缓冲区有指定字节数目的数据可用事件(bytes-availableevent)、串口接收到的数据长时间处于非激活状态事件(break-interruptevent)、串行口引脚状态改变事件(pin-statusevent)、输出缓冲区为空事件(outputemptyevent)等。

当串口上有监视的事件发生时,Matlab会自动调用回调函数进行通信事件的处理。

因此,事件驱动实质上是一种中断机制,而回调函数实质上相当于一个中断服务子程序。

Matlab端实时串行通信的程序流程如图4所示。

以下是具体的编程步骤。

  ①建立一个串行通信主程序:

serial.m文件,在主程序中进行串口设备初始化操作,并指定回调函数中串行通信的事件。

  程序主要源代码如下(创建串口设备对象、设备串口设备属性及打开串口等初始化操作的代码与前述的查询方式下的初始化代码相同):

  %设置回调函数触发事件—当串口缓冲区中有33字节的数据时,触发中断事件,此后主程序自动调用instrcallback(obj,event)回调函数

  g.BytesAvaibleFcnMode='

byte'

%中断触发事件为‘bytes-availableEvent’

  g.BytesAvailableFcnCount=33;

%接收缓冲区每收到33个字节时,触发回调函数

  g.BytesAvailableFcn=@instrcallback;

%得到回调函数句柄

  fopen(g);

%连接串口设备对象

  fwrite(g,255);

%写串口,发送握手信号0xFF(等价于十进制下的数值255)

  ②修改instrcallback(obj,event)回调函数,对所发生的串口通信事件进行处理。

  Matlab缺省的回调函数instrcallback(obj,event)存在于instrcallback.m文件中。

该文件实际上是一个有待于用户修改的程序模块。

其中只有一些最基本的程序代码,能够显示导致串口中断发生的是哪一类事件,中断事件所发生的时间以及导致事件发生的对象名等信息(修改回调函数文件时,注意要取消文件中相应信息后的分号,才能够在Matlab的命令窗口(commandwindow)中将这些信息显示出来)。

中断发生后的通信事件处理以及通信数据的分析处理任务,需要用户自行添加相应的服务程序代码。

Matlab安装目标下有两个instrcallback.m文件,我们只需要修改@instrument目录下的instrcallback.m文件即可。

当然,在修改instrcallback.m文件之前,最好对其做一个备份。

另外,需要注意的是:

程序调试过程中如果再次修改了该回调函数,要重新启动Matlab配置该文件,才能使得新的回调函数文件生效。

  修改后的instrcallback.m文件见网站。

该修改后的回调函数能够完成如下任务:

  ①实时接收单片机实时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机与PIC单片机串行通信的实现方法,利用Matlab的InstrumentControlTollbox的serial类及instrcallback()回调函数,实现基于事件驱动的实时中断通信。

使开发人员可以充分利用Matlab工具箱中的现有函数,方便地实现串行通信、数据分析处理和图形显示,大大简化系统上位机软件的编程工作量。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1