异步串行通信_第1页
异步串行通信_第2页
异步串行通信_第3页
异步串行通信_第4页
异步串行通信_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*实践教学*大学计算机与通信学院2014年秋季学期 通信系统综合训练 题 目:数字基带信号异步串行通信系统设计 专业班级: 通信工程()班 姓 名: 学 号: 指导教师: 成 绩: 摘 要计算机与外界的信息交换称为通信。常用通信方式有两种:并行通信与串行通信。串行通信又分同步和异步两种方式。本课程设计利用51单片机与串口的线路连接、并用C语言编写程序实现PC机与51单片机通过RS-232接口实现串行通信以及通过MATLAB的GUI实现单片机与PC端的界面通信,并能根据设置调整异步串行通信参数实现单片机与PC端的通信。关键字:51单片机;RS232接口;异步串行传输目录前言2第一章 基本原理3第

2、二章 系统分析52.1 AT80C51单片机52.2 RS232接口标准52.3 单片机串行通信8第三章 系统设计及调试123.1 硬件部分123.2 软件部分153.3 结果分析19设计总结21参考文献22致 谢23附录:源代码24前言近年来,在自动化控制和智能仪器仪表中,单片机的应用越来越广泛,由于单片机的运算功能较差,往往需要借助计算机系统,因此单片机和PC机进行远程通信更具有实际意义,通信的关键在于互传数据信息。51系列单片机内部的串行口具有通信的功能,该串行口可以作为通信接口,利用该串行口与PC机的串行口进行串行通信,将单片机采集的数据传送到PC机中,由PC机的高级语言或数据库语言对

3、数据进行整理及统计等复杂处理就能满足实际的应用需要。51单片机的开发除了硬件支持外,同样离不开软件。用汇编语言或C语言等高级语言编写的源程序必须转换为机器码才能被执行。目前十分流行的是Keil 8051 C编译器。它提供了集成开发环境,包括C编译器、宏汇编、连接器、库管理和仿真调试器。利用Keil C uVision编写的程序可直接调用编译器编译,连接后可直接烧至单片机上运行。在整个通信过程中,可以通过自己编写的串口调试助手,实时地读取串口的信息,并送相应的端口显示。完成51单片机与PC机的串口通信。第一章 基本原理 一条信息的各位数据被依次顺序传送的通信方式成为串行通信。串行通信可以通过串口

4、实现通信。根据信息的传送方向,串行通信可以进一步划分为单工、半双工和全双工3种。信息只能单方向传送为单工;信息能双向传送但不能同时传送为半双工;信息能够同时双向传送则为全双工。8051系列单片机有一个全双工串行口,全双工的串行通信只需要一根输出线和输入线。 RXD TXD 单 片 机 外 设 图1.1 单片机与外设串口通信原理图 串行通信又有异步通信和同步通信着两种方式。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。 异步通信实质是指甲乙通信双方采用独立的时钟,每个数据均以起始位开始,停止位结束,起始位触发甲乙双方同步时钟。每个异步串行帧中

5、的1位彼此严格同步,位周期同步。所谓异步是指发送、接收双方的数据帧与帧之间不要求同步,也不必同步。 异步通信用起始位“0”表示字符的开始,然后从低位到高位依次传送数据,最后用停止位“1”表示字符的结束。一个字符又称作一帧信息,一帧信息包括一位起始位、8位信息位、1位停止位如图1.2,若数据位增加至9位,在8051系列单片机中,第九位可以用作奇偶校验位,也可以用作地址/数据帧标志如图1.3。起始位 D0 D1 D2 D3 D4 D5 D6 D7停止位 图1.2 帧信息(无奇偶校验位)起始位D0D1D2D3D4D5D6D7D8停止位图1.3 帧信息(含奇偶校验位) 在同步通信中,每一数据块开头时发

6、送一个或两个字符,使发送与接收双方取得同步。数据块的各个字符间取消了起始位和停止位,所以通信速度得以提高如图1.4。同步通信时,如果发送的数据块之间有间隔时间,则发送同步字符填充。图 1.4 同步通信中同步字符填充 8051系列单片机串行I/O借口的工作原理就是:当要发送数据时,单片机自动将SBUF内的8位并行数据转换为一定格式的串行数据,从TXD引脚按规定的波特率来输出;当要接收数据时,要监视RXD引脚,一旦出现起始位“0”,按规定的波特率将外围设备送来的一定格式的串行数据转换成8位并行数据,等待用户读取SBUF寄存器,若不及时读取,SBUF中的数据有可能被刷新。8051系列单片机上有通用异

7、步接收/发送器(UART,UbiveralAsynchronous Receiver/Transimitter)用于串行通信,发送的数据有TXD引脚输出,接收时从RXD引脚输入,有两个缓冲器(Serial Buffer),一个做发送缓冲器,另一个作为接收缓冲器。UART是可编程的全双工(Full Duplex)的串行口。短距离的机间通信可以使用UART的TTL电平,使用驱动芯片(MAX232或1488/1489)可与通用微机进行通信。波特率时钟必须从内部定时器1或者定时器2来产生。若在应用中实现R232所有的握手方式,则必须借助单片机其它引脚用软件来处理。第二章 系统分析2.1 AT80C51

8、单片机 1 定时器/计时器 AT89C51单片机至少有16位内部定时器/计时器(T/C,Timer/Counter),提供了3个定时器。其中两个基本定时器/计数器0(T/C0)和定时器/计数器1(T/C1),它们即可以编程为定时器使用,也可以编程为计数器使用,若是计数器内部晶振驱动时钟,则是定时器;若是计数输入引脚的脉冲信号,则它是计数器。 2 串行口 串行收/发存储在特殊功能寄存器的SBUF(串行数据缓冲器),SBUF占用RAM地址为99H。实际上在单片机内部有两个数据缓冲器;发送缓冲器和接收缓冲器,它们都以SBUF来命名,只根据对SBUF特殊功能寄存器读/写操作,单片机会自动切换发送缓冲器

9、或接收缓冲器。SBUF=0x01,该操作为写操作,数值0x01会被装载到发送缓冲器。TTmpmp=SBUF,该操作为读操作,接收缓冲器的内容,接收缓冲器的内容会被赋值给变量。 3 中断系统AT89C51单片机中断系统的功能有5个中断源,2个中断优先级,从而实现二级中断嵌套,每一个中断源的优先级可有程序设定。与中断系统工作有关的特殊功能寄存器有关的特殊功能寄存器有中断允许控制寄存器IE、中断优先级控制寄存器IP以及定时器/计数器控制寄存器TCON等。2.2 RS232接口标准 RS-232C标准(协议)的全称是EIA-RS-232C标准,定义是“数据终端设备(DTE)和数据通讯设备(DCE)之间

10、串行二进制数据接口技术标准”。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。其中EIA代表美国电子工业协会,RS代表推荐标准,232是标识号,C代表RS232的最新一次修订。 RS232接口引脚定义 由于RS-232并未定义连接器的物理特性,本课程设计使用的是DB-9类型的连接器,其引脚定义如下: 图2.1 DB9引脚图表2-1 RS引脚功能表旧制JIS名称新制JIS名称全 称说 明FGSGFrame Ground连到机器的接地线TXDSDTransmitted Data数据输出线RXDRDReceived Data数

11、据输入线RTSRSRequest to Send要求发送数据CTSCSClear to Send回应对方发送的RTS的发送许可,告诉对方可以发送DSRDRData Set Ready告知本机在待命状态DTRERData Terminal Ready告知数据终端处于待命状态CDCDCarrier Detect载波检出,用以确认是否收到Modem的载波SGSGSignal Ground信号线的接地线(严格的说是信号线的零标准线)RS232C规标准接口有25条线,4条数据线、11条控制线、3条定时线、7条备用和未定义线,常用的只有9根,它们是:(1) 状态线数据准备就绪(Data set ready

12、-DSR)有效时(ON)状态,表明数据通信设备可以使用。(DCE->DTE).数据终端就绪(Data set ready-DTR)有效时(ON)状态,表明数据终端设备可以使用。(DTE>DCE)这两个信号有时连在电脑上,上电就;立即有效。这两个设备状态信号有效,只表示设备本身可用,并不表示通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。(2) 联络线请求发送(Request to send-RTS)DTE准备向DCE发送数据,DTE使该信号有效(ON状态),通知DCE要发送数据给DCE了。(DTE->DCE)允许发送(CLear to send-CTS)是

13、对RTS的响应信号。当DCE已准备好接收DTE传来的数据时,是该信号有效,通知DTE开始发送数据。(DCE->DTE)RTS/CTS请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间的切换。在全双工系统中,因配置双向通道,故不需要RTS/CTS联络信号,使其变高。(3) 数据线 发送数据(Transmitted data-TxD) DTE发送数据到DCE。(DTE->DCE) 接收数据(Received data-RxD)DCE发送数据到DTE。(DCE->DTE)(4)地线有两根SG、PG:信号地和保护地信号线。(5) 其余 载波检测(Carrier Det

14、ection-CD):用来表示DCE已接通通信链路,告知DTE准备接收数据。(DCE>DTE) 振铃指示(Ring-RI):当DCE收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知DTE,已被呼叫。(DCE>DTE) 通常的应用系统中,往往是CPU和I/O设备之间传送信息,两者都是DTE,比如PC和色温计,PC和单片机之间的通信,双方都能发送和接收,它们的连接只需要使用三根线即可,即RXD,TXD和GND。2.3 单片机串行通信串行通信方式传输数据只需要两条数据线,更加经济简单,而且大大减少了数据传输过程中的串扰现象,更利于长距离通信。所以串行通信方式在近几年得以快速

15、发展,在各种通信领域中发挥重要作用。51单片机的串行通信接口为RS-232接口,是一个全双工异步串行接口(UART)(已在2.2中详细介绍)。8051系列单片机的串行接口可以与PC机的COM接口进行通信,从而可以实现单片机的PC上位机控制。51单片机的串行数据输入口为P3.0(RXD);串行数据输出口为P3.1口(TXD)。 2.3.1 51单片机串行通信控制寄存器表2-2 51单片机串行端口控制寄存器SCON SCON(98H)位 7 6 5 4 3 2 1 0功能 SM0 SM1 SM2 REN TB8 RB8 T1 R1表2-3 SM0、SM1指定串口工作方式SM0SM1工作方式功能描述

16、波特率00方式08位移位寄存器/1201方式110位UART由定时器决定10方式211位UART/64或/3211方式311位UART由定时器决定SM2:多机通信控制位。主要用于方式2、3中;方式0不用此位应设此位为零; 方式1下此位也应设置为0,此时单片机只有接收到停止位后才置位RI位,并引发中断;方式2、3中,当SM2清零后,串口以单片机方式发送或者接收数据,无论数据的第九位(RB8)为0还是1,都能够使R1被激活,并引发中断;方式2、3中,当SM2置位后,只有接收到的第九位数据(RB8)为1时才能置位RI,并引发中断。当接收到的第九位数据为0时,不置位RI,接收到的数据丢失。REN:接收

17、允许控制位。由软件控制,置位则开始接收数据,清零则停止接收数据。TB8:方式2、3时,本位为第九位传送位,由软件设置。RB8:接收到数据的第9位。方式0不能使用该位;方式1中,如果SM2=0,该位为接收到的停止位;方式2、3中,该位为接收到数据的第9位;T1:发送中断标志位。当数据发送完成后该位置位,并引发中断。该位有硬件置位,必须由软件清零。RI:接收中断标志位。当数据接收完成后该位置位,并引发中断。该位由硬件置位,必须由软件清零。表2-4 电源控制寄存器PCON PCON(87H)位 7 6 5 4 3 2 1 0功能SMOD - - - GF1 GF0 PD IDLSMOD:波特率加倍位

18、。当串口的波特率由T1产生时,该位置位则串口波特率提高一位。GF1:通用标志位。GF2:通用标志位。PD:此位置位后,单片机进入掉电模式,只能由硬件复位。IDL:此位置位后,单片机进入空闲模式。 2.3.2 串口工作模式解析1. 方式0 在方式0下,串口的SBUF为一个同步移位寄存器。发送数据时,数据由RxD引脚串行输入/输出,TxD发出移位脉冲。8位数据发送/接收时,低位在前,高位在后。发送/接收完一帧数据后,TI/RI由硬件置位,并在中断允许的情况下向CPU请求中断。2. 方式1 方式1为波特率可变的10为异步串行通信接口。10位数据包括一个起始位0,8个数据位,1个停止位。其传输的波特率

19、由T1的溢出率决定(波特率=T1溢出率)。 当TI=0时,8位数据可以送入SBUF寄存器中,TxD便将包括起始位和停止位的8位数据发送出去,发送完成后TI置位,如果在中断允许的条件下,引发CPU中断,提醒CPU数据发送已经完成。当RI=0,且REN=1时,串行口采样RxD引脚,当采样到1至0的跳变并确认为起始位后,就开始接收一帧数据。只有当RI=0且停止位为1(或者SM2=0)时,停止位才进入RB8,8位数据才进入接收寄存器,并由硬件置位中断标志RI,否则信息丢失。所以,在方式1接收数据时,应该先用软件清零RI和SM2标志。3. 方式2 方式2为固定波特率的11为UART方式,它仅比方式1增加

20、了一个可由软件改变的第9位数据位。方式2发送数据时,数据由TxD端口输出一帧11位信息,包括起始位,8位数据,由SCON寄存器TB8决定的第9位数据,停止位。当11位数据发送完成后,硬件置位TI位,如果允许中断则引发中断过程。当REN=1时,串口串行口采样RxD引脚,当采样到1至0的跳变并确认为起始位后,就开始接收一帧数据。当SM2=0时,无论接收到的第9位为1还是0,硬件都置位RI,并将接收到的8位数据送入SBUF寄存器。当SM2=1时,只有接收到的第9位数据位为1时才能引发硬件置位RI位,8位数据送入SBUF寄存器,第9位数据送入RB8。如果在中断允许的情况下引发中断。4. 方式3方式3为

21、波特率可变的11位UART方式。除波特率由定时器1的溢出率决定外,其他与方式2相同。 2.3.3 串口波特率计算 在方式1和方式3中,使用定时器1来产生波特率,由于串口定时要求比较严格,因此一般采用定时器1的可自动重装的方式2进行计时。在定时器1方式2下,传输波特率计算公式为: (2-1)根据此式便可推导出在一定波特率下正确的定时器1初值。值得注意的是,当波特率加倍位开启后,最终的波特率应该为上式数值的两倍。2.3.4 串口初始化步骤 串口初始化过程一般为:(方式0、2不必设定T1,前4步可省去)1. T1工作方式确定(TMOD);2.TH1、TL1初值设定;3.启动定时器1(TR1);4.设

22、定波特率加倍位;5.串口工作方式确定,允许接收(SCON);6.总中断使能(不使用中断方式可不启动总中断)。第三章 系统设计及调试 本部分包括硬件设计和软件设计两部分,硬件部分主要是实现单片机与PC机的双向通信,软件部分则是通过串口助手来调试PC端与单片机之间发送的具体信息。3.1 硬件部分此部分实现PC端与单片机端的双向通信,PC端的电平是TTL,需要通过MAX232电平转换电路来实现TTL电平与单片机的RS232电平之间的转换。各组成电路如下图:AT89C51的外围电路MAX232电平转换电路RS232接口电路异步串口通信电路 图3.1 硬件电路组成图 3.1.1 AT89C51及其外围电

23、路 在系统设计中使用AT89C51单片机作为下位机与PC机进行串口通信。AT89C51是美国ATMEL公司生产的低电压高性能的CMOS8位单片机片内置4Kbits的可反复擦写的只读程序存储器PEROM和128bytes的随机存储器RAM器件采用ATMEL公司的高密度、非易失存储技术生产兼容标准MCS-51指令系统片内置通用8位中央处理器CPU和Flash存储单元功能强大。AT89C51包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。本设计中主要是利用AT89C51的异步通信UART模式原理

24、实现单片机与PC机之间的串口通信的。下图是AT89C51及其外围电路图3.2 AT89C51及其外围电路该电路可以实现单片机在固定的振荡频率上正常工作,以及更好的实现PC端与单片机的通信。3.1.2 电平转换电路一般单片机的串口通信都需要通过MAX232进行电平转换后进行数据通信的,当然AT89C51单片机也不例外,下图是电平转换电路,其中单片机的TXD与MAX232的R1OUT相连,单片机的RXD与MAX232的T1IN相连;T1OUT与RS232的RXD相连,R1IN与RS232的TXD相连。 由于RS232的逻辑“0”电平规定为+5V- +15V,逻辑“1”电平规定为-15V- -5V,

25、因此不能直接连接与TTL/CMOS电路连接,必须进行电平转换。 电平转换可以使用三极管等分离器件实现,也可采用专用的电平转换芯片,MAX232就是其中典型的一种。MAX232不仅能够实现电平的转换,同时也实现了逻辑的相互转换即正逻辑转负逻辑。 图3.3 MAX232电平转换电路 下图是整体硬件电路图的设计,同过该图可以实现从PC端发送数据,通过数码管可以显示PC端发送的信息;也可以通过按键,在通信界面显示由单片机发来的信息。图3.4 硬件部分电路3.2 软件部分该部分需要通过在Windows XP系统下利用VSPD虚拟出两个需要进行通信的COM端口号,利用keil编写出单片机初始化以及与PC机

26、通信的程序,通过MATLAB的GUI编写二者通信的串口界面,从而实现信息的串行异步传输。软件部分流程图如下:开始编写程序利用VSPD虚拟一对进行通信的COM口利用MATLAB的GUI编写的串口助手用于查看串口的信息给keil绑定COM2利用串口助手给相应端口发信息结束图3.5 软件部分流程图 开始T1工作方式确定(TMOD)初值设定TH1、TL1启动定时器1(TR1)设定波特率加倍位串口工作方式确定,允许接收(SCON) 总中断使能(启动)PC端向单片机发送数据单片机向PC端发送数据TI=1TI=1NNYYY结束置RI=0,单片机等待发送置TI=0,PC端等待发送图3.6程序设计流程图 单片机

27、程序设计的流程图如上,通过对程序初始化,可以实现单片机与PC端的通信。通过置中断标志位可以实现单片机对数据的读写操作。 具体的软件操作流程如下所述: 首先,需要虚拟出进行通信的两个串口,如下图,图中虚拟出通信的两个端口COM1<->COM2口,并将keil绑定至COM2口,利用串口通信助手打开需要通信的COM1口,从而实现二者的通信。图3.7 VSPD虚拟出的COM1、COM2口图3.7 keil绑定COM2端口的界面 图3.7中是给已编好的C文件添加*.INI为后缀的配置文件,文件内容为: MODE COM2 9600,0,8,1/keil绑定COM2,设置其波特率、校验位、数据

28、位和停止位的参数ASSIGN COM2 <SIN> SOUT/设置keil的寄存器名为S,设定其输入与输出图3.9 串口助手界面上图是利用MATLAB的GUI设计的串口通信助手的界面,通过该界面可以读取串口的信息,也可以向串口发送信息。图3.10 PC端向单片机发送消息界面 上图是由PC端向单片机发送消息的界面,在PC端发送一串字符可以在COM2口(单片机端)接收到,并在接收框显示,表明实现了PC端向单片机端的通信。图3.11 单片机向PC端发送信息的界面图3.12 PC端接收单片机的信息界面 图3.10是单片机向PC机发送信息的界面,通过发送可以在PC端的显示界面上显示(如图3.

29、11所示)。表明实现了由单片机到PC端的通信。3.3 结果分析 硬件部分的电路仿真从原理上可以说明实现了单片机与PC机的双向串行异步通信,代码的编译没有问题,可能是硬件设计存在问题,最后的硬件仿真图没有实现预定的结果。 软件部分的仿真可由上述图3.10至3.12说明通过软件可以实现PC端与单片机的双向串行异步通信。但当发送的数据过于多,速度过快时,仿真出来的串口助手有时会突然关闭,以至于不能正确读取信息,这也是软件设计部分的局限所在,其余功能在XP系统上运行良好。设计总结本次课程设计历时3周,在其中学到了很多新知识,也锻炼了自己的动手能力和学习新知识的能力。认识到在老师的指引和帮助下以及同学之

30、间互相讨论的过程中很多棘手的问题都可以解决,从中学到的不仅有学科知识,还有许多解决问题的能力。为此,需要不断地积累基础知识,试着自己独立地解决一些问题。 在这次课程设计中,也感到自己在动手方面的欠缺,只是在现学现用,并没有足够的知识储备,在用的时候马上放到恰当的位置。另外,在理论方面还存在许多欠缺的地方,因此在设计代码的过程中走了不少弯路。因此在今后的工作和学习中,要规划好要做的事情,夯实理论基础,实现高效工作。参考文献1 张旭涛. 曾现峰. 单片机原理与应用. 北京:北京理工大学出版社.2006 2 穆兰. 单片微型计算机原理及接口技术. 北京:机械工业出版社.2002 3 杨金岩. 郑应强

31、. 51单片机数据传输接口扩展技术与应用实例. 北京:人民邮电出版社.2006 4 胡伟. 季晓衡. 单片机C程序设计及应用实例. 北京:人民邮电出版社.2006 5 黄智伟. 全国大学生电子设计竞赛系统设计.北京:北京航空航天大学出版社. 2006 6 胡汉才组编. 单片机原理及接口技术. 北京:清华大学出版社,1996 致 谢 在本次课程设计中,首先要感谢我的同学们,在我遇到困难时,他们给了我很大的帮助。最重要的是要感谢彭老师的悉心支持与帮助,让我少走了许多弯路,再次真的谢谢您,您给了我们很大的帮我们遇到困难时,您给我们耐心指导,不厌其烦地给我们演示。可以说没有您的帮助,我们的设计将很难完

32、成,在此我要对您的谆谆教诲表示衷心的感谢!附录:源代码串口调试助手源代码清单:function varargout = serial_communication2(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, . 'gui_Singleton', gui_Singleton, . 'gui_OpeningFcn', serial_communication2_OpeningFcn, . 'gui_OutputFcn', serial_com

33、munication2_OutputFcn, . 'gui_LayoutFcn', , . 'gui_Callback', );if nargin && ischar(varargin1) gui_State.gui_Callback = str2func(varargin1);end if nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);endfunction serial_communic

34、ation2_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;warning('off');javaFrame = get(hObject, 'JavaFrame');javaFrame.setFigureIcon(javax.swing.ImageIcon('icon.jpg');% 初始化参数hasData = false; %表征串口是否接收到数据isShow = false; %表征是否正在进行数据显示,即是否正在执行函数dataDispi

35、sStopDisp = false; %表征是否按下了【停止显示】按钮isHexDisp = false; %表征是否勾选了【十六进制显示】isHexSend = false; %表征是否勾选了【十六进制发送】numRec = 0; %接收字符计数numSend = 0; %发送字符计数strRec = '' %已接收的字符串% 将上述参数作为应用数据,存入窗口对象内setappdata(hObject, 'hasData', hasData);setappdata(hObject, 'strRec', strRec);setappdata(hO

36、bject, 'numRec', numRec);setappdata(hObject, 'numSend', numSend);setappdata(hObject, 'isShow', isShow);setappdata(hObject, 'isStopDisp', isStopDisp);setappdata(hObject, 'isHexDisp', isHexDisp);setappdata(hObject, 'isHexSend', isHexSend);guidata(hObject

37、, handles);function varargout=serial_communication2_OutputFcn(hObject, eventdata, handles) varargout1 = handles.output;function com_Callback(hObject, , handles)function com_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUico

38、ntrolBackgroundColor') set(hObject,'BackgroundColor','white');endfunction rate_Callback(hObject, eventdata, handles) function rate_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor&#

39、39;) set(hObject,'BackgroundColor','white');endfunction jiaoyan_Callback(hObject, eventdata, handles)function jiaoyan_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor') set(hObject,

40、'BackgroundColor','white');endfunction data_bits_Callback(hObject, eventdata, handles)function data_bits_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor') set(hObject,'Backgrou

41、ndColor','white');end function stop_bits_Callback(hObject, eventdata, handles) function stop_bits_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor') set(hObject,'BackgroundColor'

42、;,'white');end function start_serial_Callback(hObject, eventdata, handles)% 【打开/关闭串口】按钮的回调函数% 打开串口,并初始化相关参数 % 若按下【打开串口】按钮,打开串口if get(hObject, 'value') % 获取串口的端口名 com_n = sprintf('com%d', get(, 'value'); % 获取波特率 rates = 300 600 1200 2400 4800 9600 19200 38400 43000 560

43、00 57600 115200; baud_rate = rates(get(handles.rate, 'value'); % 获取校验位设置 switch get(handles.jiaoyan, 'value') case 1 jiaoyan = 'none' case 2 jiaoyan = 'odd' case 3 jiaoyan = 'even' end % 获取数据位个数 data_bits = 5 + get(handles.data_bits, 'value'); % 获取停止位个

44、数 stop_bits = get(handles.stop_bits, 'value'); % 创建串口对象 scom = serial(com_n); % 配置串口属性,指定其回调函数 set(scom, 'BaudRate', baud_rate, 'Parity', jiaoyan, 'DataBits',. data_bits, 'StopBits', stop_bits, 'BytesAvailableFcnCount', 10,. 'BytesAvailableFcnMode&

45、#39;, 'byte', 'BytesAvailableFcn', bytes, handles,. 'TimerPeriod', 0.05, 'timerfcn', dataDisp, handles); % 将串口对象的句柄作为用户数据,存入窗口对象 set(handles.figure1, 'UserData', scom); % 尝试打开串口 try fopen(scom); %打开串口 catch % 若串口打开失败,提示“串口不可获得!” msgbox('串口不可获得!'); set(

46、hObject, 'value', 0); %弹起本按钮 return; end % 打开串口后,允许串口发送数据,清空接收显示区,点亮串口状态指示灯, % 并更改本按钮文本为“关闭串口” set(handles.period_send, 'Enable', 'on'); %启用【自动发送】按钮 set(handles.manual_send, 'Enable', 'on'); %启用【手动发送】按钮 set(handles.xianshi, 'string', ''); %清空接收

47、显示区 set(handles.activex1, 'value', 1); %点亮串口状态指示灯 set(hObject, 'String', '关闭串口'); %设置本按钮文本为“关闭串口”else %若关闭串口 % 停止并删除定时器 t = timerfind; if isempty(t) stop(t); delete(t); end % 停止并删除串口对象 scoms = instrfind; stopasync(scoms); fclose(scoms); delete(scoms); % 禁用【自动发送】和【手动发送】按钮,熄灭串口

48、状态指示灯 set(handles.period_send, 'Enable', 'off', 'value', 0); %禁用【自动发送】按钮 set(handles.manual_send, 'Enable', 'off'); %禁用【手动发送】按钮 set(handles.activex1, 'value', 0); %熄灭串口状态指示灯end function dataDisp(obj, event, handles)% 串口的TimerFcn回调函数% 串口数据显示% 获取参数hasDat

49、a = getappdata(handles.figure1, 'hasData'); %串口是否收到数据strRec = getappdata(handles.figure1, 'strRec'); %串口数据的字符串形式,定时显示该数据numRec = getappdata(handles.figure1, 'numRec'); %串口接收到的数据个数% 若串口没有接收到数据,先尝试接收串口数据if hasData bytes(obj, event, handles);end% 若串口有数据,显示串口数据if hasData % 给数据显示模

50、块加互斥锁 % 在执行显示数据模块时,不接受串口数据,即不执行BytesAvailableFcn回调函数 setappdata(handles.figure1, 'isShow', true); % 若要显示的字符串长度超过10000,清空显示区 if length(strRec) > 10000 strRec = '' setappdata(handles.figure1, 'strRec', strRec); end % 显示数据 set(handles.xianshi, 'string', strRec); % 更新接

51、收计数 set(handles.rec,'string', numRec); % 更新hasData标志,表明串口数据已经显示 setappdata(handles.figure1, 'hasData', false); % 给数据显示模块解锁 setappdata(handles.figure1, 'isShow', false);end function bytes(obj, , handles)% 串口的BytesAvailableFcn回调函数% 串口接收数据% 获取参数strRec = getappdata(handles.figure

52、1, 'strRec'); %获取串口要显示的数据numRec = getappdata(handles.figure1, 'numRec'); %获取串口已接收数据的个数isStopDisp = getappdata(handles.figure1, 'isStopDisp'); %是否按下了【停止显示】按钮isHexDisp = getappdata(handles.figure1, 'isHexDisp'); %是否十六进制显示isShow = getappdata(handles.figure1, 'isShow&

53、#39;); %是否正在执行显示数据操作% 若正在执行数据显示操作,暂不接收串口数据if isShow return;end% 获取串口可获取的数据个数n = get(obj, 'BytesAvailable');% 若串口有数据,接收所有数据if n % 更新hasData参数,表明串口有数据需要显示 setappdata(handles.figure1, 'hasData', true); % 读取串口数据 a = fread(obj, n, 'uchar'); % 若没有停止显示,将接收到的数据解算出来,准备显示 if isStopDisp

54、 % 根据进制显示的状态,解析数据为要显示的字符串 if isHexDisp c = char(a'); else strHex = dec2hex(a')' strHex2 = strHex; blanks(size(a, 1); c = strHex2(:)' end % 更新已接收的数据个数 numRec = numRec + size(a, 1); % 更新要显示的字符串 strRec = strRec c; end % 更新参数 setappdata(handles.figure1, 'numRec', numRec); %更新已接收的数据个数 setappdata(handles.figure1, 'strRec', strRec); %更新要显示的字符串endfunction qingkong_Callback(hObject, eventdata, handles)% 清空要显示的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论