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

发布者:素心静听最新更新时间:2015-07-08 来源: 51hei关键字:中断方式  串口通讯 手机看文章 扫描二维码
随时随地手机看文章
一般普遍的把串口通讯分为查询方式和中断方式。查询方式比较容易理解,各种书籍上都介绍的比较清楚。但中断方式,没有几本书讲得好的,甚至有些例程根本无法实际应用。
    问题有:
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(){
    …;//初始化
    While (1) {
      If (rx_flag ==1){//查询接收标志
        rx_flag = 0; //清楚接收标志
        x = temp; //从暂存变量读取数据
        …;//接收处理
      }
      …;  //其它操作
    }
  }
这里的问题是:如果串口接收数据的间隔时间小于“接收处理”和“其它操作”所用的时间时,接收数据会丢失一部分。
    正确使用中断方式处理串口收发应达到以下目的:
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--;//累减信号量
      tx_run = True;//置发送标志位
    }
    else tx_run = False;//清除发送标志位
  }
}
//发送处理程序,由应用程序调用
//输入:发送数据指针,发送数据长度
void tx_data(char * txbuf,uint8 len){
  while (len){
    tx_circbuf [tx_circin] = *txbuf++;// 存入数据到发送缓冲区
    if (++tx_circin >= BUF_SIZE) tx_circin = 0;
    tx_sem++;//累减信号量
    len--;
    if (tx_run == False)TI=1;//查询发送状态标志。若发送空闲,触发中断,发送数据的工作由中断程序自动完成。
  }
}
 
正确的中断接收方法如下:
1,建立一个足够大小的环形接收缓冲区,建立一个信号量(用于指示接收的数据量)。
2,发生接收中断时,读出字节放入接收缓冲区,并累加信号量。
3,应用程序查询接收标志,如信号量不为0,则从接收缓冲区读取数据进行处理,累减信号量。
C51的例程如下:
//变量定义
#define BUF_SIZE 0x10//环形收发缓冲区长度
//接收参数
char rx_circbuf[BUF_SIZE];// 环形接收缓冲区
uint8 rx_sem;// 信号量
uint8 rx_circin;//进环形缓冲区的位置指示
uint8 rx_circout;//出环形缓冲区的位置指示
//接收初始化程序
void rx_init(void){
  //硬件初始化 略
  //接收参数初始化
  rx_sem = 0;
  rx_circin = 0;
  rx_circout = 0;
}
//中断程序
void rx_int(void) interrupt 4 {
  if (RI){
    RI = 0;
    rx_circbuf [rx_circin] = SBUF;// 读出字节放入接收缓冲区
    if (++rx_circin >= BUF_SIZE) rx_circin = 0;
    rx_sem++;//累加信号量
  }
}
//接收处理程序,由应用程序调用
//输出:读出数据指针;返回:接收到的数据长度
uint8 rx_data(char * rxbuf){
  uint8 i;
  i = 0;
  while (rx_sem){
    *rxbuf++ = rx_circbuf [rx_circout];// 从接收缓冲区读取数据
    if (++rx_circout >= BUF_SIZE) rx_circout = 0;
    rx_sem--;//累减信号量
    i++;
  }
  return i;
}
 
上述的收发中断程序在应用中合并在一起,即:
void uart_init(void) interrupt 4 {
  if (TI){
    TI = 0;
    …;
  }
  if (RI){
    RI = 0;
    …;
  }
}
例程中分开表述,只是为了将流程说得更明白些。
上述例程中,未包含环形收发缓冲区溢出状况的处理,需要时自行添加。
上述例程表明了正确使用中断方式处理串口通讯的思路。当然程序还可以有其它的写法,特别是环形缓冲区中数据出入的方法和信号量的用法。如在有操作系统的情况下,上述信号量的使用就可以得到操作系统更好支持。
完全中断方式收发数据总结:
1。数据的收发操作,完全由中断程序自动进行,可以达到最快的收发速度。即,接收时中断程序负责把数据放入缓冲区,数据的处理由应用程序另行处理;发送时应用程序直接将数据放入缓冲区,启动发送中断后,发送的工作由中断程序自动完成。
2。由于发送的工作完全由中断处理,因此,应用程序将数据放入缓冲区后,就可以继续运行其它工作,这种“发了不管”的方式极大地提高程序运行效率。
3。接收数据时,由中断负责将数据放入缓冲区,再由应用程序处理。应用程序轮询及处理的时间长短,不会影响接收,就不会导致数据丢失。
4。由于应用程序中不出现开关中断的操作,因此,发送和接收互不影响,可以达到全双工收发的效果。
期望上述文字能给予大家借鉴,如有差错,望予指正,谢谢。
关键字:中断方式  串口通讯 引用地址:中断方式下进行串口通讯的正确方法

上一篇:简单流水灯的实现
下一篇:单片机的TCP/IP的实现与UNIX的不同

推荐阅读最新更新时间:2024-03-16 14:24

STM32串行通讯采用中断方式发送,接收
近期发现很多人都不愿意用中断方式,来使用STM32的串口。说是问题多。但自己测试了,中断没有任何问题。无论接收和发送。 我贴出源程序。 注意一点是:USART_ITConfig(USART3, USART_IT_TXE, ENABLE); 这个函数一旦执行,就会启动一次中断,正是这个原因,许多人想尽方法去避免空发送,但实际上这是设计者的智慧所在。用空中断启动发送!无需在执行:SART_SendData(USART3, UART3_Buf.SendBuf ); //启动发送! 一旦启动了中断,就在中断程序里继续发送。 发送初始化程序:将要发送的数据准备好,放在一个BUF里: COM3_EN(SEND_EN)
[单片机]
中断调用方式的ARM二次开发接口设计
随着信息技术的飞速发展,基于ARM芯片的可编程智能嵌入式设备在我们的日常生活中扮演着越来越重要的角色。由于程序的设计者在设计软件程序和功能的时候,所针对的对象是社会上的通常情况,并没有根据最终不同的使用者来加以设计,因此各个软件的实际使用者在使用软件时会根据自己的使用要求和市场需求预测,对软件再加以开发,即俗称的二次开发 。如今,Android系统和苹果产品等都给用户提供开发平台,便于用户开发自己的程序。为了适应用户简易嵌入式应用程序的开发,缩短二次开发周期,开发一种低成本的专用嵌入式二次开发工具就显得十分必要。其中,二次开发工具最重要的部分就是二次开发接口的设计。   通过对现有嵌入式二次开发技术的研究发现3个问题。问题一
[单片机]
<font color='red'>中断</font>调用<font color='red'>方式</font>的ARM二次开发接口设计
51单片机串口通讯UART
1、串行通信的的基本知识 在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交换均可称为通信。 通信的方式有两种,分别为串行通信和并行通信。我们通常根据实际信息传输的距离还决定采用哪种通信方式。 并行通信: 并行通信是指数据的各位同时进行传送(发送或者接收)的通信方式。其优点是传送速度快,缺点是数据有多少位,就需要有多少根传送线。 串行通信: 串行通信是指数据 一位一位的按顺序传送的通信,他的优点是传送线少(只需要一对传输线),特别适用于远距离的数据通信,缺点是传送速度低。 其通信的原理如下图所示 串行通信的数据传输方式: 分为3
[单片机]
51单片机<font color='red'>串口通讯</font>UART
STM32—串口通讯详解
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播;协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。下面分析一下串口通讯协议的物理层和协议层。 物理层 1.通讯结构 串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下: 在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平
[单片机]
STM32—<font color='red'>串口通讯</font>详解
51单片机串口通讯接收一串字符串
在51单片机中,我们使用上下位机时,我们通常会发送一串字符串,将它作为信号发给单片机处理。 因为串口通信时,发送信息是以一个个字符的形式发送过来的,所以接收的就是一个个字符,通常我们是一个字符数组保存,在进行下一步处理,同时字符数组长度固定有限,但是如果上位机发送的字符不满足我们想要处理的数据时,其接收的数据多出的部分就有可能保存在SBUF中, 影响接下来的数据接收,以至于接下来的数据不满足我们的要求。或是发送数据少于数组长度时,也会出错。 在这里我的解决办法(以下以STC12C5A60S2芯片为例): void serial_port_one_init() { //根据自己单片机设置;
[单片机]
atmega8 例程:AD中断方式采集
/*********************************************************** * 函数库说明:ATMEGE8 AD模数转换 * 版本: v1.0 * * 说明: 中断方式AD采集 * * 版本更新: 详见readme.txt *
[单片机]
中断方式下进行串口通讯的正确方法
一般普遍的把串口通讯分为查询方式和中断方式。查询方式比较容易理解,各种书籍上都介绍的比较清楚。但中断方式,没有几本书讲得好的,甚至有些例程根本无法实际应用。 问题有: 1,半中断法。只使用接收中断,不使用发送中断,发送时还是依靠查询中断标志的办法;如下: ES = 0;//若是接收使用中断方式,某些单片机需要关中断。但C51不一定需要。这里只是示例。 SBUF = needsendchar; While (!TI); TI = 0; ES = 1; 这里的问题是:发送数据时需要等待数据发完才能继续其他工作,程序效率降低;发送时需要关中断,影响数据接收。 2,接收中断的处理方法错误。如下: 中断程序:
[单片机]
STC12C5A60S2双串口通讯基础程序
程序9600波特率 下 STC单片机双串口通讯发基础程序,程序内容,各自中断接收,中断转发接收到的数据。需要两个串口同时工作的可以用的上。 单片机源程序如下: /*----------------------------------------------- 名称:STC12C5A60S2双串口通信 编写:Nico 日期:2009.5 修改:无 内容:9600波特率 双串口收发 接线:串口1 发送P3.1,接收P3.0 串口2 发送P1.3,接收P1.2 ------------------------------------------------*/ #include stc12c5
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved