matlab串口通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:结合单片机和Matlab两者优点,基于事件驱动中断通信机制,提出一种Matlab环境下PC机与单片机实时串行通信及数据处理方法;完成单片机数据采集系统与PC机RS-232/RS-485串行通信及其通信数据分析处理、文件存储、FIR滤波及图形显示;简化系统开发流程,提高开发效率。该方法已成功应用于一个PIC16F876单片机应用系统实例之中。
②打开串口设备对象。
fopen(scom);
③读写串口操作。初始化并打开串口调协对象之后,现在可以对串口设备对象进行读写操作,串口读写操作支持二进制和文本(ASCII)两种方式。当Matlab通信数据采用西方(ASCII)方式时,读写串口设备命令分别是fscanf、fpritf;当Matlab通信数据采用二进制方式时,读写串口设备命令分别是fread、fwrite。下面以文本方式读写串口为例:
PIC16F876端串行通信C语言程序流程如图3所示,相应主要通信源代码如下:
//串口相关寄存器初始化子程序
void sci_initial(){
SPBRG=0C0A; //设置通信波特率为115.2kb/s
TXSTA=0X04; //选择异步高速通信模式
RCSTA=0x80; //串行口使能,接收数据长度为8位,无奇偶校验
}
delay_ms(5); //PIC单片机定时5ms发送第2组A/D转换数据
send1_data[0]=rec_data[0]; //在第2组数据中嵌入回送握手数据0xFF
for(j=0;j<33;j ){
TXREG=send1_data[j];//发送第2组32个字节A/D转换数据及握手信号数据
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
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采样数据信息。
④关闭并清除设备对象。
fclose(scom);%关闭串口设备对象
delete(scom);%删除内存中串口设备对象
clear scom; %清除工作空间中串口设备对象
当不再使用该串口设备对象时,顺序使用以上3条命令,可以将所创建串口对象对象清除,以免占用系统资源。
可以看出,在Matlab中进行串行通信是十分方便,编程较为简单。而且,在Matlab中串行通信失误率很低,通信较为可靠,也可以采用增加握手信号以及数据校验等方式进一步增加通信可靠性。
While(!TXIF); //查询发送标志位,等待数据发送完毕再进行下一次数据发送
}
}
}
3 Matlab环境下PC机与单片机通信
在Matlab6.0中新增设备控制工具条(instrument control toolbox)用来负责上、下位机之间通信。该设备控制工具箱特色如下:
①支持基于串行接口(RS-232、RS-422、RS-485)、GPIB总线(IEEE2488、HPIB标准)、VISA总线通信;
另外,设置串口设置对象属性也可以用一条指令完成,如:scom=serial('COM1','BaudRate',38400,'Parity','none','DataBits',8,'StopBits',1)。也可以用set命令,如set(scom,'BaudRate',19200,'Parity','even')。创建了对象后可以在Matlab命令窗口直接敲对象名并回车,看到其基本属性和当前状态。若需要知道其全部属性,可以用get(scom)命令。
2 PIC16F876与PC源自文库串行通信接口设计
2.1 PIC16F876单片机串行通信接口硬件设计
PIC16F876微处理器芯片内部集成了一个串行通信(SCI)模块。该模块是一个通用同步/异步收发(USART)通信接口。
图2
PIC16F876SCI通信接口有两个外部引脚——RC6/TX(SCI发送输出引脚)和RC7/RX(SCI接收输入引脚),引脚信号电平为TTL类型;而PC机串口异步串行通信基于RS232标准。两者通信信号逻辑电平不一致,必须进行信号电平转换。为此,在电路中选用Maxim公司MAX232芯片,以实现TTL电平与RS-232电平双向转换。RS-232通信距离一般以不超过12m为宜,在工业控制现场很受限制。为保证硬件设计兼容性和易扩展性,能够应用于不同场合,考虑到实际应用需要,在硬件电路中还可选用一个MAX491芯片,添加了一个RS-485通信接口。
PCbfans.cn提示请看下图:
1 系统总体设计简介
下面以Mircochip公司PIC16F876单片机为下位机,PC机为上位机组成实时数据采集处理系统为例,介绍基于Matlab环境下PC机与单片机串行通信实时数据处理方法实现。数据采集系统结构框图如图1所示。PC机串口与单片机USART口通过MAX232电平转换芯片相连,系统工作时,Matlab通过调用设备控制工具箱中serial类及相关函数。来创建串口设备对象,得到设备文件句柄,从而以操作文件方式实现对PC机串行口读写操作。因而PC机可以通过Matlab向串行口发送特殊指令,PIC单片机应用系统对此作出相应反应,将A/D采样数据通过串行口回送给PC机。此时,Matlab通过中断方式,实时接收单片机发送数据,并完成对数据分析处理、文件存储、FIR滤波及图形显示。
②通信数据支持二进制和文本(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
fwrite(g,255);%以二进制方式发送握手信号0xFF,缺省为异步通信方式
out=fread(g,33,'uint8')%接收单片机发送33个数据(8位),并存入out数组中
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个字节数据
while(!TXIF); //查询发送标志位,等待数据发送完毕再进行下一次数据发送
TRISC6=0; //RC6引脚设置为输出方式
TRISC7=1; //PC7引脚设置为输入方式
}
//串口接收和发送数据子程序
void sci_com(){
while(!RCIF); //查询接收中断标志位,等待上位机发送串口数据
rec_data[0]=RCREG;//接收串口数据PCbfans.cn提示请看下图:
3.2 Matlab实现串行通信软件设计
在Matlab环境下,读取串口数据方式可以分为两种—查询和中断。以查询方式进行串行通信时,如下位单片机有大量数据分时分批传送给PC机,就需要不停查询串行口缓冲区,有数据就读取;虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统资源。以中断方式对串口进行控制实现串行通信,就可以实时处理下位机传送数据;但编程相对复杂一些,需要采用Matlab事件和回调函数机制。
如图2所示,实际使用过程中,系统可以根据需要,灵活使用不同通信标准,十分方便。当PIC单片机SCI通信接口引脚直接通过MAX232芯片与PC机串口相连时,系统采用RS-232通信标准;当PIC单片机SCI通信接口口引脚与MAX489芯片DI、RO引脚相连时,系统采用RS-485通信标准。另外,还可通过PIC单片机控制MAX489芯片DE、RE引脚,随时使能或屏蔽掉MAX489数据接收和数据发送功能。
a.读串口。A=fscanf(scom,'%d',[10,100];%从串口设备对象scom中读入10*100个数据填充到数组A[10,100]中,并以整型数据格式存放。PCbfans.cn提示请看下图:
h.写串口。Fprintf(scom,'%s','RS232','async');%将字符串‘RS232?’以字符数据格式写入到串口设备scom,写操作以异步方式进行。
注意:在些属性只有在对象没有被打开时才能改变其值,如InputBufferSize、OutputBufferSize属性等。对于一个RS-232/RS-422/RS-485串口设备对象,其属性缺省值为波特率9 600b/s,异步方式,通信数据格式为8位数据位,无奇偶校验位,1位停止位。如果要设置串口设置对象属性值与缺省值属性值相同,用户可以不用另行设置。
关键词: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)基于Matlab查询方式异步串行通信编程
Matlab查询方式串行通信编程虽然简单,但这种方法在实际应用中实用价值不高,下面只作简单介绍。通信源程序如下:
clc;%初始化串口设备对象,设置串口属性为:PC机com2口,输入缓冲区为1024,读写最大完成时间为0.6s,波特率为115 200b/s,1位停止位,遇到换行符中止,硬件流控制
scom.OutputBufferSize=1024;%输出缓冲区为256B,缺省值为512B
scom.Timeout=0.5;%Y设置一次读或写操作最大完成时间为0.5s,缺省值为10s
s.ReadAsyncMode='continuous'(缺省方式);%在异步通信模式方式下,读取串口数据采用连续接收数据(continuous)缺省方式,那么下位机返回数据会自动地存入输入缓冲区中.
②打开串口设备对象。
fopen(scom);
③读写串口操作。初始化并打开串口调协对象之后,现在可以对串口设备对象进行读写操作,串口读写操作支持二进制和文本(ASCII)两种方式。当Matlab通信数据采用西方(ASCII)方式时,读写串口设备命令分别是fscanf、fpritf;当Matlab通信数据采用二进制方式时,读写串口设备命令分别是fread、fwrite。下面以文本方式读写串口为例:
PIC16F876端串行通信C语言程序流程如图3所示,相应主要通信源代码如下:
//串口相关寄存器初始化子程序
void sci_initial(){
SPBRG=0C0A; //设置通信波特率为115.2kb/s
TXSTA=0X04; //选择异步高速通信模式
RCSTA=0x80; //串行口使能,接收数据长度为8位,无奇偶校验
}
delay_ms(5); //PIC单片机定时5ms发送第2组A/D转换数据
send1_data[0]=rec_data[0]; //在第2组数据中嵌入回送握手数据0xFF
for(j=0;j<33;j ){
TXREG=send1_data[j];//发送第2组32个字节A/D转换数据及握手信号数据
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
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采样数据信息。
④关闭并清除设备对象。
fclose(scom);%关闭串口设备对象
delete(scom);%删除内存中串口设备对象
clear scom; %清除工作空间中串口设备对象
当不再使用该串口设备对象时,顺序使用以上3条命令,可以将所创建串口对象对象清除,以免占用系统资源。
可以看出,在Matlab中进行串行通信是十分方便,编程较为简单。而且,在Matlab中串行通信失误率很低,通信较为可靠,也可以采用增加握手信号以及数据校验等方式进一步增加通信可靠性。
While(!TXIF); //查询发送标志位,等待数据发送完毕再进行下一次数据发送
}
}
}
3 Matlab环境下PC机与单片机通信
在Matlab6.0中新增设备控制工具条(instrument control toolbox)用来负责上、下位机之间通信。该设备控制工具箱特色如下:
①支持基于串行接口(RS-232、RS-422、RS-485)、GPIB总线(IEEE2488、HPIB标准)、VISA总线通信;
另外,设置串口设置对象属性也可以用一条指令完成,如:scom=serial('COM1','BaudRate',38400,'Parity','none','DataBits',8,'StopBits',1)。也可以用set命令,如set(scom,'BaudRate',19200,'Parity','even')。创建了对象后可以在Matlab命令窗口直接敲对象名并回车,看到其基本属性和当前状态。若需要知道其全部属性,可以用get(scom)命令。
2 PIC16F876与PC源自文库串行通信接口设计
2.1 PIC16F876单片机串行通信接口硬件设计
PIC16F876微处理器芯片内部集成了一个串行通信(SCI)模块。该模块是一个通用同步/异步收发(USART)通信接口。
图2
PIC16F876SCI通信接口有两个外部引脚——RC6/TX(SCI发送输出引脚)和RC7/RX(SCI接收输入引脚),引脚信号电平为TTL类型;而PC机串口异步串行通信基于RS232标准。两者通信信号逻辑电平不一致,必须进行信号电平转换。为此,在电路中选用Maxim公司MAX232芯片,以实现TTL电平与RS-232电平双向转换。RS-232通信距离一般以不超过12m为宜,在工业控制现场很受限制。为保证硬件设计兼容性和易扩展性,能够应用于不同场合,考虑到实际应用需要,在硬件电路中还可选用一个MAX491芯片,添加了一个RS-485通信接口。
PCbfans.cn提示请看下图:
1 系统总体设计简介
下面以Mircochip公司PIC16F876单片机为下位机,PC机为上位机组成实时数据采集处理系统为例,介绍基于Matlab环境下PC机与单片机串行通信实时数据处理方法实现。数据采集系统结构框图如图1所示。PC机串口与单片机USART口通过MAX232电平转换芯片相连,系统工作时,Matlab通过调用设备控制工具箱中serial类及相关函数。来创建串口设备对象,得到设备文件句柄,从而以操作文件方式实现对PC机串行口读写操作。因而PC机可以通过Matlab向串行口发送特殊指令,PIC单片机应用系统对此作出相应反应,将A/D采样数据通过串行口回送给PC机。此时,Matlab通过中断方式,实时接收单片机发送数据,并完成对数据分析处理、文件存储、FIR滤波及图形显示。
②通信数据支持二进制和文本(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
fwrite(g,255);%以二进制方式发送握手信号0xFF,缺省为异步通信方式
out=fread(g,33,'uint8')%接收单片机发送33个数据(8位),并存入out数组中
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个字节数据
while(!TXIF); //查询发送标志位,等待数据发送完毕再进行下一次数据发送
TRISC6=0; //RC6引脚设置为输出方式
TRISC7=1; //PC7引脚设置为输入方式
}
//串口接收和发送数据子程序
void sci_com(){
while(!RCIF); //查询接收中断标志位,等待上位机发送串口数据
rec_data[0]=RCREG;//接收串口数据PCbfans.cn提示请看下图:
3.2 Matlab实现串行通信软件设计
在Matlab环境下,读取串口数据方式可以分为两种—查询和中断。以查询方式进行串行通信时,如下位单片机有大量数据分时分批传送给PC机,就需要不停查询串行口缓冲区,有数据就读取;虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统资源。以中断方式对串口进行控制实现串行通信,就可以实时处理下位机传送数据;但编程相对复杂一些,需要采用Matlab事件和回调函数机制。
如图2所示,实际使用过程中,系统可以根据需要,灵活使用不同通信标准,十分方便。当PIC单片机SCI通信接口引脚直接通过MAX232芯片与PC机串口相连时,系统采用RS-232通信标准;当PIC单片机SCI通信接口口引脚与MAX489芯片DI、RO引脚相连时,系统采用RS-485通信标准。另外,还可通过PIC单片机控制MAX489芯片DE、RE引脚,随时使能或屏蔽掉MAX489数据接收和数据发送功能。
a.读串口。A=fscanf(scom,'%d',[10,100];%从串口设备对象scom中读入10*100个数据填充到数组A[10,100]中,并以整型数据格式存放。PCbfans.cn提示请看下图:
h.写串口。Fprintf(scom,'%s','RS232','async');%将字符串‘RS232?’以字符数据格式写入到串口设备scom,写操作以异步方式进行。
注意:在些属性只有在对象没有被打开时才能改变其值,如InputBufferSize、OutputBufferSize属性等。对于一个RS-232/RS-422/RS-485串口设备对象,其属性缺省值为波特率9 600b/s,异步方式,通信数据格式为8位数据位,无奇偶校验位,1位停止位。如果要设置串口设置对象属性值与缺省值属性值相同,用户可以不用另行设置。
关键词: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)基于Matlab查询方式异步串行通信编程
Matlab查询方式串行通信编程虽然简单,但这种方法在实际应用中实用价值不高,下面只作简单介绍。通信源程序如下:
clc;%初始化串口设备对象,设置串口属性为:PC机com2口,输入缓冲区为1024,读写最大完成时间为0.6s,波特率为115 200b/s,1位停止位,遇到换行符中止,硬件流控制
scom.OutputBufferSize=1024;%输出缓冲区为256B,缺省值为512B
scom.Timeout=0.5;%Y设置一次读或写操作最大完成时间为0.5s,缺省值为10s
s.ReadAsyncMode='continuous'(缺省方式);%在异步通信模式方式下,读取串口数据采用连续接收数据(continuous)缺省方式,那么下位机返回数据会自动地存入输入缓冲区中.