中断方式下进行串口通讯的正确方法.pdfVIP

中断方式下进行串口通讯的正确方法.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中断方式下进行串口通讯的正确方法 一般普遍的把串口通讯分为查询方式和中断方式。 查询方式比较容易理解,各种书籍上都介绍的比较清楚。 但中断方式,没有几本书讲得好的,甚至有些例程根本 无法实际应用。 问题有: 1,半中断法。只使用接收中断,不使用发送中断,发送 时还是依靠查询中断标志的办法;如下: ES = 0;// 若是接收使用中断方式,某些单片机需要关中 断。但 C51 不一定需要。这里只是示例。 SBUF = needsendchar; While (!TI); TI = 0; ES = 1; 这里的问题是:发送数据时需要等待数据发完才能继续 其他工作,程序效率降低;发送时需要关中断,影响数 据接收。 2 ,接收中断的处理方法错误。如下: 中断程序: void ser() interrupt 4 { RI = 0; temp = SBUF; // 读走数据,放入缓存(全局的)变量 rx_flag = 1; // 设置接收标志 } 主程序: void main(){ hellip;;// 初始化 While (1) { If (rx_flag ==1){// 查询接收标志 rx_flag = 0; // 清楚接收标志 x = temp; // 从暂存变量读取数据 hellip;;// 接收处理 } hellip;; // 其它操作 } } 这里的问题是:如果串口接收数据的间隔时间小于 ldquo; 接收处理 rdquo; 和ldquo; 其它操作 rdquo; 所 用的时间时,接收数据会丢失一部分。 正确使用中断方式处理串口收发应达到以下目的: 1,完全使用中断控制接收和发送,以达到最快的收发速 度。 2 ,接收和发送互不影响,达到全双工通讯效果。 3,应用程序不发生等待,以达到最高运行效率。 正确的中断发送方法如下: 1,建立一个足够大小的环形发送缓冲区,建立一个信号 量 (用于指示发送的数据量) ,建立一个发送标志位 (用 于指示发送状态)。 2 ,应用程序将数据写入环形发送缓冲区,查询发送接收 标志,若不在发送状态,手动触发中断。 3,产生发送中断时,查询信号量,以判别发送缓冲区内 是否有数据;若有,置发送标志位,从缓冲区读取数据 发送,累减信号量;若无,清除发送标志位。 C51 的例程如下: // 变量定义 #define BUF_SIZE 0x10// 环形收发缓冲区长度 // 发送参数 char tx_circbuf[BUF_SIZE];// 环形发送缓冲区 uint8 tx_sem;// 信号量 bool tx_run;// 发送标志位 uint8 tx_circin;// 进环形缓冲区的位置指示 uint8 tx_circout;// 出环形缓冲区的位置指示 // 发送初始化程序 void tx_init(void){ // 硬件初始化 略 // 发送参数初始化 tx_sem = 0; tx_run = False; tx_circin = 0; tx_circout = 0; } // 中断程序 void tx_int(void) interrupt 4 { if (TI){ TI = 0; if (tx_sem){ SBUF = tx_circbuf [tx_circout]; // 发送缓冲区 中的字符 if (++tx_circout ;= BUF_SIZE) tx_circout = 0; tx_sem--;/

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档