
matlab环境下pc机与单片机的通信及数据处理.pdf
5页27Microcontrollers / / 设置通信波特率为1 1 5 . 2 k b / s T X S T A = 0 X 0 4 ;/ / 选择异步高速通信模式 R C S T A = 0 X 8 0 ;/ / 串行口使能, 接收数据长度为8 位, / / 无奇偶校验 T R I S C 6 = 0 ;/ / R C 6 引脚设置为输出方式 T R I S C 7 = 1 ;/ / R C 7 引脚设置为输入方式 } / / 串口接收和发送数据子程序 v o i d s c i _ c o m ( ) { w h i l e ( ! R C I F ) ;/ / 查询接收中断标志位, 等待上位机发 / / 送的串口数据 r e c _ d a t a [ 0 ] = R C R E G ; / / 接收串口数据 i f ( r e c _ d a t a [ 0 ] = = 0 x F F ) { s e n d _ d a t a [ 0 ] = r e c _ d a t a [ 0 ] ;/ / 在第1 组数据中嵌入回送 / / 握手数据0 x F F f o r ( j = 0 ; j < 3 3 ; j + + ) {T X R E G = s e n d _ d a t a [ j ] ;/ / 发送第1 组3 2 字节的A / D/ / 转换数据, 包含握手信号0 x F F 为3 3 个字节数据w h i l e ( ! T X I F ) ;/ / 查询发送标志位, 等待数/ / 据发送完毕再进行下一次数据发送 } d e l a y _ m s ( 5 ) ;/ / P I C 单片机定时5 m s 发送 / / 第2 组A / D 转换数据 s e n d 1 _ d a t a [ 0 ] = r e c _ d a t a [ 0 ] ; / / 在第2 组数据中嵌入回送 / / 握手数据0 x F F f o r ( j = 0 ; j < 3 3 ; j + + ) {T X R E G = s e n d 1 _ d a t a [ j ] ;/ / 发送第2 组3 2 个字节A / D / / 转换数据及握手信号数据w h i l e ( ! T X I F ) ;/ / 查询发送标志位, 等待数/ / 据发送完毕再进行下一次数据发送 } } }3 M a t l a b 环境下P C 机与单片机的通信在 M a t l a b 6 . 0 中新增的设备控制工具箱( i n s t r u m e n tc o n t r o l t o o l b o x ) 用来负责上、下位机之间的通信。
该设备控制工具箱的特色如下:① 支持基于串行接口( R S - 2 3 2 、R S - 4 2 2 、R S - 4 8 5 ) 、G P I B 总线( I E E E 2 4 8 8 、H P I B 标准) 、V I S A 总线的通信;② 通信数据支持二进制和文本( A S C I I ) 两种方式,文本方式支持 S C P I ( S t a n d a r d C o m m a n d s f o r P r o g r a m m a b l eI n s t r u m e n t s ) 语言;③ 支持异步通信和同步通信;④ 支持基于事件驱动的通信从以上 M a t l a b设备控制工具箱的特点可以看到,M a t l a b完全可以满足我们实现串行通信的要求3 . 1 M a t l a b 对串行口控制的基础知识M a t l a b对串行口的编程控制主要分为四个步骤① 创建串口设备对象并设置其属性s c o m = s e r i a l ( ' c o m 1 ' ) ; % 创建串口1 的设备对象s c o ms c o m . T e r m i n a t o r = ' C R ' ; % 设置终止符为C R ( 回车符) ,缺省为L F ( 换行符)s c o m . I n p u t B u f f e r S i z e = 1 0 2 4 ; % 输入缓冲区为2 5 6 B , 缺省值为5 1 2 Bs c o m . O u t p u t B u f f e r S i z e = 1 0 2 4 ; % 输出缓冲区为2 5 6 B ,缺省值为 5 1 2 Bs c o m . T i m e o u t = 0 . 5 ; % 设置一次读或写操作的最大完成时间为0 . 5 s ,缺省值为1 0 ss . R e a d A s y n c M o d e = ' c o n t i n u o u s ' ( 缺省方式) ; % 在异步通信模式方式下, 读取串口数据采用连续接收数据( c o n t i n u o u s ) 的缺省方式,那么下位机返回的数据会自动地存入输入缓冲区中。
注意:有些属性只有在对象没有被打开时才能改变其值, 如I n p u t B u f f e r S i z e 、 O u t p u t B u f f e r S i z e 属性等 对于一个R S - 2 3 2 / R S - 4 2 2 / R S - 4 8 5 串口设备对象,其属性的缺省值为波特率9 6 0 0 b / s ,异步方式,通信数据格式为8 位数据位,无奇偶校验位,1位停止位如果要设置的串口设备对象的属性值与缺省值的属性值相同,用户可以不用另行设置另外,设置串口设备对象的属性也可以用一条指令完成, 如 : s c o m = s e r i a l ( ' C O M 1 ' , ' B a u d R a t e ' , 3 8 4 0 0 , ' P a r i t y ' ,' n o n e ' , ' D a t a B i t s ' , 8 , ' S t o p B i t s ' , 1 ) 也可以用s e t 命令,如s e t ( s c o m , ' B a u d R a t e ' , 1 9 2 0 0 , ' P a r i t y ' , ' e v e n ' ) 。
创建了对象后可以在M a t l a b命令窗口直接敲对象名并回车,看到其基本属性和当前状态若需要知道其全部的属性,可以用g e t ( s c o m ) 命令② 打开串口设备对象f o p e n ( s c o m ) ;③ 读写串口操作初始化并打开串口设备对象之后,现在可以对串口设备对象进行读写操作,串口的读写操作支持二进制和文本( A S C I I ) 两种方式当M a t l a b 通信数据采用文本( A S C I I ) 方式时,读写串口设备的命令分别是f s c a n f 、f p r i t f ;当M a t l a b 通信数据采用二进制方式时,读写串口设备的命令分别是f r e a d 、f w r i t e 下面以文本方式读写串口为例:a . 读串口A = f s c a n f ( s c o m ,' % d ' , [ 1 0 ,1 0 0 ] ; % 从串口设备对象s c o m 中读入1 0 * 1 0 0 个数据填充到数组A [ 1 0 ,1 0 0 ] 中,并以整型的数据格式存放302 0 0 4 . 1 2技术纵横TECHNOLOGY REVIEW单片机与嵌入式系统应用b . 写串口。
f p r i n t f ( s c o m , ' % s ' , ' R S 2 3 2 ? ' , ’ a s y n c ’ ) ;%将字符串’R S 2 3 2 ? ’以字符的数据格式写入到串口设备 s c o m ,写操作以异步的方式进行④ 关闭并清除设备对象f c l o s e ( s c o m ) ; %关闭串口设备对象d e l e t e ( s c o m ) ; %删除内存中的串口设备对象c l e a r s c o m ;%清除工作空间中的串口设备对象当不再使用该串口设备对象时,顺序使用以上 3条命令,可以将所创建的串口设备对象清除,以免占用系统资源可以看出,在 M a t l a b中进行串行通信是十分方便的,编程较为简单而且,在M a t l a b 中串行通信的失误率很低,通信较为可靠,也可以采用增加握手信号以及数据校验等的方式进一步增加通信的可靠性3 . 2 M a t l a b 实现串行通信的软件设计在 M a t l a b 环境下,读取串口数据的方法可以分为两种— —查询和中断以查询的方式进行串行通信时,如下位单片机有大量的数据分时分批传送给 PC机,就需要不停查询串行口的缓冲区,有数据就读取;虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统的资源。
以中断的方式对串口进行控制实现串行通信,就可以实时处理下位机传送的数据;但编程相对复杂一些,需要采用 M a t l a b的事件和回调函数机制 1 ) 基于M a t l a b 查询方式的异步串行通信编程M a t l a b查询方式的串行通信编程虽然简单,但这种方法在实际应用中实用价值不高,下面只作简单介绍通信源程序如下:c l c ; %初始化串口设备对象,设置串口属性为: P C 机c o m 2 口,输入缓冲区为 1 0 2 4 ,读写最大完成时间为 0 . 6 s ,波特率为 1 1 5 2 0 0 b / s ,1 位停止位,遇到换行符中止,硬件流控制g = s e r i a l ( ' c o m 2 ' ) ;g . I n p u t B u f f e r S i z e = 4 0 9 6 ;g . t i m e o u t = 0 . 6 ;g . B a u d R a t e = 1 1 5 2 0 0 ;g . P a r i t y = ' n o n e ' ;g . S t o p B i t s = 1 ;g . T e r m i n a t o r = ' L F ' ;g . F l o w C o n t r o l = ' h a r d w a r e ' ;f o p e n ( g ) ; % 打开串口设备对象 sf w r i t e ( g ,2 5 5 ) ; % 以二进制的方式发送握手信号0 x F F ,缺省为异步通信方式o u t = f r e a d ( g , 3 3 , ' u i n t 8 ' ) % 接收单片机发送的3 3 个数据( 8 位) ,并存入o u t数组中%释放串口设备对象f c l o s e ( g ) ;d e l e t e ( g ) ;c l e a r g ;( 2 ) 基于M a t l a b中断方式的实时串行通信编程在M a t l a b 环境下以中断的方式进行串行通信,实际上是采用事件驱动的方法实现的。
Matlab提供了i n s t r c a l l b a c k ( o b j , e v e n t ) 回调函数, 用户根据需要可以自行设置具体的串行通信事件M a t l a b常用的串行口通信中断事件有:缓冲区有指定字节数目的数据可用事件( b y t e s - a v a i l a b l e e v e n t ) 、 串口接收到的数据长时间处于非激活状态事件( b r e a k - i n t e r r u p t e v e n t ) 、 串行口引脚状态改变事件( p i n - s t a t u s e v e n t ) 、输 出 缓 冲 区 为 空 事 件( o u t p u t。
