利用中断实现UART串口_第1页
利用中断实现UART串口_第2页
利用中断实现UART串口_第3页
利用中断实现UART串口_第4页
全文预览已结束

下载本文档

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

文档简介

1、中断方式下进行串口通讯的正确方法一般普遍的把串口通讯分为查询方式和中断方式。查询方式比较容易理解,各种书籍上都介绍的比较清楚。但中断方式,没有几本书讲得好的,甚至有些例程根本无法实际应用。问题有:1,半中断法。只使用接收中断,不使用发送中断,发送时还是依靠查询中断标志的办法;如下:ES=0;/若是接收使用中断方式,某些单片机需要关中断。但C51不一定需要。这里只是示例。SBUF=needsendchar;While(!TI);TI=0;ES=1;这里的问题是:发送数据时需要等待数据发完才能继续其他工作,程序效率降低;发送时需要关中断,影响数据接收。2,接收中断的处理方法错误。如下:中断程序:v

2、oidser()interrupt4RI=0;temp=SBUF;/读走数据,放入缓存(全局的)变量rx_flag=1;/设置接收标志主程序:voidmain(),;/初始化While(1)If(rx_flag=1)/查询接收标志rx_flag=0;/清楚接收标志x=temp;/从暂存变量读取数据,;/接收处理,;/其它操作这里的问题是:如果用口接收数据的间隔时间小于“接收处理”和“其它操作”所用的时间时,接收数据会丢失一部分。正确使用中断方式处理用口收发应达到以下目的:1,完全使用中断控制接收和发送,以达到最快的收发速度2,接收和发送互不影响,达到全双工通讯效果。3,应用程序不发生等待,以达

3、到最高运行效率。正确的中断发送方法如下:1,建立一个足够大小的环形发送缓冲区,建立一个信号量(用于指示发送的数据量),建立一个发送标志位(用于指示发送状态)。2,应用程序将数据写入环形发送缓冲区,查询发送接收标志,若不在发送状态,手动触发中断。3,产生发送中断时,查询信号量,以判别发送缓冲区内是否有数据;若有,置发送标志位,从缓冲区读取数据发送,累减信号量;若无,清除发送标志位。C51的例程如下:/变量定义#defineBUF_SIZE0x10/环形收发缓冲区长度/发送参数chartx_circbufBUF_SIZE;/环形发送缓冲区uint8tx_sem;/信号量booltx_run;/发送

4、标志位uint8tx_circin;/进环形缓冲区的位置指示uint8tx_circout;/出环形缓冲区的位置指示/发送初始化程序voidtx_init(void)/硬"腐始化略/发送参数初始化tx_sem=0;tx_run=False;tx_circin=0;tx_circout=0;一/中断程序voidtx_int(void)interrupt4if(TI)TI=0;if(tx_sem)SBUF=tx_circbuftx_circout;/发送缓冲区中的字符if(+tx_circout>=BUF_SIZE)tx_circout=0;tx_sem-;累减信号量tx_run=

5、True;/置发送标志位.elsetx_run=False;/消除发送标志位/发送处理程序,由应用程序调用/输入:发送数据指针,发送数据长度voidtx_data(char*txbuf,uint8len)while(len)tx_circbuftx_circin=*txbuf+;存入数据到发送缓冲区if(+tx_circin>=BUF_SIZE)tx_circin=0;tx_sem+;/累减信号量len-;if(tx_run=False)TI=1;/查询发送状态标志。若发送空闲,触发中断,发送数据的工作由中断程序自动完成。正确的中断接收方法如下:1,建立一个足够大小的环形接收缓冲区,建立

6、一个信号量(用于指示接收的数据量)。2,发生接收中断时,读出字节放入接收缓冲区,并累加信号量。3,应用程序查询接收标志,如信号量不为0,则从接收缓冲区读取数据进行处理,累减信号量。C51的例程如下:/变量定义#defineBUF_SIZE0x10/环形收发缓冲区长度/接收参数charrx_circbufBUF_SIZE;/环形接收缓冲区uint8rx_sem;/信号量uint8rx_circin;/进环形缓冲区的位置指示uint8rx_circout;/出环形缓冲区的位置指示/接收初始化程序voidrx_init(void)/硬件初始化略/接收参数初始化rx_sem=0;rx_circin=0

7、;rx_circout=0;/中断程序voidrx_int(void)interrupt4if(RI)RI=0;rx_circbufrx_circin=SBUF;/读出字节放入接收缓冲区if(+rx_circin>=BUF_SIZE)rx_circin=0;rx_sem+;/累加信号量)/接收处理程序,由应用程序调用/输出:读出数据指针;返回:接收到的数据长度uint8rx_data(char*rxbuf)uint8i;i=0;while(rx_sem)*rxbuf+=rx_circbufrx_circout;/从接收缓冲区读取数据if(+rx_circout>=BUF_SIZE)

8、rx_circout=0;rx_sem-;累减信号量i+;)returni;)上述的收发中断程序在应用中合并在一起,即:voiduart_init(void)interrupt4if(TI)一TI=0;,;)if(RI)RI=0;)例程中分开表述,只是为了将流程说得更明白些。上述例程中,未包含环形收发缓冲区溢出状况的处理,需要时自行添加。上述例程表明了正确使用中断方式处理用口通讯的思路。当然程序还可以有其它的写法,特别是环形缓冲区中数据出入的方法和信号量的用法。如在有操作系统的情况下,上述信号量的使用就可以得到操作系统更好支持。完全中断方式收发数据总结:1。数据的收发操作,完全由中断程序自动进行,可以达到最快的收发速度。即,接收时中断程序负责把数据放入缓冲区,数据的处理由应用程序另行处理;发送时应用程序直接将数据放入缓冲区,启动发送中断后,发送的工作由中断程序自动完成。2。由于发送的工作完全由中断处理,因此,应用程序将数据放入缓冲区后,就可以继续运行其它工作

温馨提示

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

评论

0/150

提交评论