中断法串口通信

发布者:DelightfulGaze最新更新时间:2012-08-06 来源: 51hei关键字:中断法  串口通信  死循环 手机看文章 扫描二维码
随时随地手机看文章

第一个例子:

避免死循环,一直发数据(用自设接收数据标志位法,不用关串口中断ES方法)flag必须放if语句中的最后位置,否则死循环

#include
#define uchar unsigned char
#define uint  unsigned int
uchar flag=0,temp; 
void init()
{
 TMOD=0X20;//定时器1方式2作为波特率发生器
 TH1=0XF3;//装初值 波特率为4800bps的初值
 TL1=0XF3;
 TR1=1;//启动定时器1
 SCON=0X50;//设置串口工作方式为方式1
 PCON=0X80;//加倍波特率后为4800
 EA=1;//开总中断
 ES=1;//允许串口中断
 TI=0;//清发送中断标志位
 RI=0;//清接收中断标志位
}
void main()
{
 init();
 while(1)
 {
  if(flag==1)
  {
   //ES=0;//flag为1说明接收完引起中断
   //flag=0;//清中断标志
   RI=0;//对接收中断标志清零,为下一帧数据接收作准备
   temp=SBUF;//读入接收数据,在不关中断ES前提下,CPU读入接收数据也不会引起中断,
接收数据由接收SBUF接收缓存器自动执行
   P0=temp;  //读入数据送P0口
   SBUF=temp; //向发送方返回接收数据
   //TI=0;    //要等待发送完,否则数据没发送完TI=0,flag=0已经执行
   //flag=0;  //发送完后引起中断,flag又置1,进入死循环,一直发数据
   while(!TI);//等待发送完,!!要等待!!
      TI=0;//数据发送完对发送中断标志清零,为下一帧数据发送作准备
   flag=0; //必须有否则进入死循环,放最后
   //ES=1;//允许串口中断继续接收数据
  }
 }
}
void serial() interrupt 4
{
 flag=1;
}

----------------------第2个例子:-----------------------------------------------

/***********************************************
      中断法串口通信(用关串口中断ES方法)推荐不丢帧
***********************************************/
#include
#define uchar unsigned char
#define uint  unsigned int
uchar flag=0,temp; 
void init()
{
 TMOD=0X20;//定时器1方式2作为波特率发生器
 TH1=0XF3;//装初值 波特率为4800bps的初值
 TL1=0XF3;
 TR1=1;//启动定时器1
 SCON=0X50;//设置串口工作方式为方式1
 PCON=0X80;//加倍波特率后为4800
 EA=1;//开总中断
 ES=1;//允许串口中断
 TI=0;//清发送中断标志位
 RI=0;//清接收中断标志位
}
void main()
{
 init();
 while(1)
 {
  if(flag==1)
  {
   ES=0;//flag为1说明接收完引起中断,关串口中断,处理当前帧
   flag=0;//清中断标志
   RI=0;//对接收中断标志清零,为下一帧数据接收作准备,此处清零不丢帧
   temp=SBUF;//读入接收数据,在不关中断ES前担下,CPU读入接收数据也不会引起中断,
接收数据由接收SBUF接收缓存器自动执行
   P0=temp;  //读入数据送P0口
   SBUF=temp; //向发送方返回接收数据
   //TI=0;    //要等待发送完,否则数据没发送完TI=0,flag=0已经执行
   //flag=0;  //发送完后引起中断,flag又置1,进入死循环,一直发数据
   while(!TI);//等待发送完,!!要等待!!
      TI=0;//数据发送完对发送中断标志清零,为下一帧数据发送作准备
   //flag=0; //必须有否则进入死循环,放最后
   ES=1;//允许串口中断继续接收数据
  }
 }
}
void serial() interrupt 4//执行此句,即产生中断表示数据已接收完
{
    //RI=0;//不在此清零接收中断标志,否则接收SUBF处于一直接收状态,
中断一直进行影响其它指令进行,造成返回丢帧现象实验得出
 flag=1;
}
关键字:中断法  串口通信  死循环 引用地址:中断法串口通信

上一篇:查表法矩阵键盘
下一篇:浅谈如何按键消抖

推荐阅读最新更新时间:2024-03-16 13:05

STM8L 串口通信波特率异常
串口配置 2400/9600/57600/115200 波特率出现异常 使用16M时钟的时候,2400和115200不正常,乱码,但是在这中间频率又是好的;修改时钟才能适应不同时钟频率。。。;看寄存器配置是完全没有问题的。 经过分析,是因为在配置串口波特率的时候BBR1,BBR2的配置顺序有问题引起的。 解决方法: 确保先配置BBR2再配置BBR1,否则会出现波特率异常 USART1- BBR2 = XXXXX; USART1- BBR1 = XXXXX;
[单片机]
基于嵌入式WinCE与MSP430单片机多串口通信设计
目前WinCE嵌入式与MSP430单片机在仪器仪表、工业控制、移动设备等有着广泛的应用。在很多复杂的应用场合比如多点温度采集、多点转速采集,一个单片机不能满足要求,需要多台单片机协同工作,此时,多台单片机通信是实现的关键。以基于WinCE嵌入式设备为核心,取代传统意义上的PC机,采用TCP/IP通信机制搭建的串口通信系统,结合嵌入式设备和网络技术的优点,将各独立系统复杂的通信协议、数据格式进行统一的转化,特别适用于远程、多机串口通信,具有重要的使用价值和应用前景。 1 硬件平台 1)WinCE嵌入式采用友善之臂mini2440开发板作为硬件平台,mini2440开发板主要的硬件资源包括:SamsungS3C2440A,主频4
[单片机]
基于嵌入式WinCE与MSP430单片机多<font color='red'>串口通信</font>设计
STM32中的串口通信的基础知识
串口通信基本原理 并行通信与串行通信 ① 并行通信传送八路信号,一次并行传送传送完整的一个字节信息。串行通信在一个方向上只能传送一路信号,一次只能传送一个二进制位,传送一个字节信息时,只能一位一位地依次传送; ② 串行的传输速度慢,但是对线路的要求低一些。 并行的对线路的要求高,但是速度快; ③ 串行线路仅使用一对信号线,线路成本低并且抗干扰能力强,因此可以用在长距离通讯上;而并行线路使用多对信号线(还不包括额外的控制线路),线路成本高并且抗干扰能力差,因此对通讯距离有非常严格的限制。 串行通信中单工,半双工和全双工的区别 单工,半双工和全双工是通过传输方向不同而分的。具体说明如下: 按通信方式不同又可分为异
[单片机]
STM32中的<font color='red'>串口通信</font>的基础知识
【STM32】5分钟了解STM32的串口通信
一、串口通信简介 1.1 百度百科解释 来源百度百科 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。 1.2 通信接口 1.3 串口通信分类 ▲ 全双工、半双工和单工 1.4 STM32串行通信的通信方式 插播一条反爬虫信息,读者可以忽略: 二、STM32的串口通信 ▲ USART 功能框图 2.1 功能引脚 TX: 发送数据输出引
[单片机]
【STM32】5分钟了解STM32的<font color='red'>串口通信</font>
STM32学习之使用库函数编写串口通信
注:使用的芯片是STM32F103ZET6 一、串口初始化部分的程序 1.初始化时钟   因为要使用串口1这个外设,因此在使用之前就需要开启串口1的时钟,并且之后还需要设置IO输入输出的模式,在这里我们也需要开启GPIO的时钟。程序如下: //初始化串口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //初始化GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   可是为什么要初始化时钟呢在《STM32中文参考手册_V10》的RCC中有这样一句话“当外设时钟没有启用时,软件不能读出
[单片机]
STM32学习之使用库函数编写<font color='red'>串口通信</font>
51单片机串口通信的发送与接收 字符串
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。 在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。 看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。 接收数据时,基本上都是使用 中断方式 ,这是正确合理的。 即:每当收到一个新数据,就在中断函数中,把 RI 清零,并用一个变量,通知主函数,收到了新数据。 发送数据时,很多的程序都是使用的 查询方式 ,就是执行 while(T
[单片机]
单片机利用串口通信传送温度
/********该程序主要是利用DS18B20采集温度,然后通过数码管显示温度*************/ /*当程序收到上位机发送的命令之后,该程序会将当时的温度值通过串口发送给上位机*/ #include reg51.h #define uchar unsigned char #define uint unsigned int sbit DQ = P1^0; //定义DS18B20的信号线端口 uchar i,j; uchar dis_buffer ;//定义数据缓冲数组 uchar bit_ser ={0xfe,0xfd,0xfb,0xf7}; //定义数码管片选数组 uchar seven_seg = {
[单片机]
串口通信预备知识
0、前言 计算机通信是指计算机与外部设备或者计算机与计算机之间的信息交换。 通信分为并行通信和串行通信,在多微机系统以及现代测控系统中信息的交换多采用串行通信方式 串行口工作前,应对其进行初始化,设置产生波特率的定时器1、串行口控制和中断控制。 0.1并行通信 每次发送前,会进行询问,接收方进行应答,相当于一次握手。8位同时发送。一般用于计算机内部总线、排线等需求高速的传输。 0.2串行通信 0.3异步通信 一个字节前面1位是起始位,中间是8位数据,最后一位是停止位,一个字节中的各个位之间的时间间隔是固定的(由波特率决定),每个字节之间的时间间隔则是任意的。 注意:同一字符内的各位之间是有间隔的,
[单片机]
<font color='red'>串口通信</font>预备知识
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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