精华内容
下载资源
问答
  • c51串口中断发送

    2020-09-21 15:56:36
    我发现基本上代码都是查询发送,很少见中断发送的,从某种意义上来说查询发送和中断发送开销是差不多的,但是优先级应该是有区别的,查询是直接送数据sbuf,然后查询标志位,判断是否发送完成,那中断法发送?
  • 搞定串口中断发送

    2011-04-25 22:18:00
    原来也很简单啊! 关键的一步是要触发串口发送中断(即强制给一个中断标志),否则就永远进不了。

    原来也很简单啊!

    关键的一步是要触发串口发送中断(即强制给一个中断标志),否则就永远进不了。

    展开全文
  • 实时性在嵌入式开发中的非常重要,优化MCU串口传输...第一次先介绍串口发送数据的优化。 发送方式一: 方式一采用“死等”的方式发送数据,即在while循环中等待字发送完成标志位置位。 void usartsend(void) { ...

    实时性在嵌入式开发中的非常重要,优化MCU串口传输处理方式可以提高嵌入式系统的实时性。在互联网上学习并亲自实验(基于STM32单片机)后,我将分两次介绍优化MCU串口收发数据的方法,参考资料将在第二篇博客中列出。第一次先介绍串口发送数据的优化。

    发送方式一:

    方式一采用“死等”的方式发送数据,即在while循环中等待字发送完成标志位置位。

    void usartsend(void)
    {
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待上一字节发送完成 
        USART1->DR=txbuf[cnt]; //要发送的字节存入串口数据寄存器 
    }
    
    void sendcmd(void)
    {
        for(cnt=0;cnt<100;cnt++)//发送100个字节
        {
            usartsend();//调用字节发送函数
        }
    }
    
    

    这种方式在while循环中消耗了大量时间,而且sendcmd函数中一遍遍地调用usartsend函数也比较费时。实验中我采用的波特率为115200,理论上发送完100字节数据耗时约8.68ms,而在硬件仿真时的耗时约9.45ms。在这9.54ms内,MCU除了发送字节和while等待外没有处理其他任务,严重影响系统实时性。

    发送方式二:

    方式二采用中断的方式发送数据。要发送数据时,使能串口的发送缓冲区空中断,在ISR中判断是否有数据要发送,如果有,则将要发送的字节存入串口数据寄存器。当所有数据发送完毕后禁止串口的发送缓冲区空中断。

    void usartsend(void)
    {
        USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//使能串口的发送缓冲区空中断
    }
    
    void USART1_IRQHandler(void) //串口1的ISR              
    {
        if(USART_GetITStatus(USART1,USART_IT_TXE)==SET)
        {
            USART1->DR=txbuf[cnt];
            cnt++;
            if(cnt>=100)
            {
                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//数据发送完毕,禁止串口的发送缓冲区空中断
            }
        }
    } 

    这种方式主要是ISR占用时间。采用115200的波特率实验时,发送100字节数据用时约8.51ms。用时小于理论时间(8.68ms)的原因可能是最后一个字节没发送完程序就到了我设的断点。

    第二种方法的用时比第一种方法少。更值得注意的是第二种方法花费的8.51ms是分片的,程序不会死等8.51ms,在此期间MCU可以处理其他任务,系统的实时性高。而第一种方法程序死等9.54ms,MCU在此期间无法处理其他任务,实时性收到严重影响。

    展开全文
  • STM32串口中断接收和中断发送

    万次阅读 多人点赞 2016-03-12 15:12:14
    STM32串口USART1中断接收和中断发送 先贴出中断函数: void USART1_IRQHandler(void){  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RX

    STM32串口USART1中断接收和中断发送


    先贴出中断函数:

    void USART1_IRQHandler(void){
            if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
                     USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                     USART1_Buffer[i++]=USART_ReceiveData(USART1);  //USART1_Buffesh是一个自己定义的接收数组
                     if(i>3){
                          SendFlag = 1;
                     }
             }
            if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){    //USART_IT_TC这里也可替换
                    if(Open_Send_Flag){     //这是一个发送的标志
                          uart1_sendstring(temp_data);
                         USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
                         Open_Send_Flag = 0;
                     }
                    else{
                         USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC
                     }
             }
    }

    发送字符串的函数:

    void uart1_sendstring(uint8_t* cp)
    {
        while((*cp)!='\0')
        {
            Usart1_Send_isr(*cp);
            cp++;
        }
    }

    发送单个字符的函数:

    void Usart1_Send_isr(uint8_t ch){
         USART_SendData(USART1, (uint8_t)ch);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断
    }

    然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE);    //USART_IT_TC

    之后再贴出两个简单的串口接收和发送的测试小例子:


    第一种:中断接收并把接收到的数据直接发送。
    void USART1_IRQHandler(void){
          unsigned char RxData;
          if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                RxData=USART_ReceiveData(USART1); 
                RxData = RxData + 1;
               USART_SendData(USART1,RxData);
          }
    }

    优点:简单,适合很少量数据传输。
    缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。

    第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。
    void USART1_IRQHandler(void){
    
    
     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
           USART_ClearITPendingBit(USART1, USART_IT_RXNE);
           USART1_Buffer[i++]=USART_ReceiveData(USART1); 
       }
     if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){
          Flag = 1;
     }
     if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){  //溢出,不明白?
      USART_ClearFlag(USART1,USART_FLAG_ORE);
      USART_ReceiveData(USART1); 
     }
     if(Flag){
      for(j = 0;j<20;j++){
            USART_SendData(USART1,USART1_Buffer[j]);
      }
     }
    }


    展开全文
  • STM8S103之串口查询发送+中断发送

    千次阅读 2017-07-10 22:08:04
    本文以STM8S103F3P6编程为例,介绍STM8S103F3P6串口中断发送。 二、实验平台 电脑平台:Windows7 64位旗舰 编译软件:IAR 硬件平台:STM8S103F3P6 三、版权声明 博主:_懵懂 声明:此博客仅供参考不做...

     

    本篇博文最后修改时间:2017年08月04日 18:29。

     

    一、简介

    本文以STM8S103F3P6编程为例,介绍STM8S103F3P6串口中断发送。

     

    二、实验平台

    电脑平台:Windows7 64位旗舰

    编译软件:IAR

    硬件平台:STM8S103F3P6

     

    三、版权声明

    博主:_懵懂

    声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。

    原文地址:http://blog.csdn.NET/qq_18842031

    懵懂之MCU交流群:136384801

     

    四、实验前提

    1、在进行本文步骤前,请先安装IAR  EWSTM8-EV-1311版本;准备好STM8S103F3P6硬件平台。

             

    五、基础知识

    暂无

     

    六、源码地址

    暂无

     

    七、实验内容

    1.系统时钟初始化为内部16M

      CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //时钟   初始化时钟为1分频 16M   2分频8M
    

     

    2.初始化串口

    void Init_UART1(void)
    {
      UART1_DeInit();                            //恢复串口所有寄存器
      UART1_Init((u32)9600,                      //波特率9600
                 UART1_WORDLENGTH_8D,            //8位
                 UART1_STOPBITS_1,               //停止位1
                 UART1_PARITY_NO,               
                 UART1_SYNCMODE_CLOCK_DISABLE,   
                 UART1_MODE_TXRX_ENABLE);
      UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);  //使能接收中断
    //  UART1_ITConfig(UART1_IT_TC, ENABLE);       //使能发送中断  发送中断使能是那里需要才使能
      UART1_Cmd(ENABLE);
    }

     

    3.编写查询方式发送数据入口

    void UART1_Send(uint8_t *dat,uint8_t len)
    {
      uint8_t i = 0;
      for(i=0; i<len; i++)
      {
        while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
        UART1_SendData8(*dat++);
      }
    }
    

     

    4.编写中断方式发送数据入口

    uint8_t Rxd_buf[20];       //接收数组
    uint8_t Rxd_len;            //接收长度
    uint8_t Rxd_F;              //接收标志位
    uint8_t Txd_buf[20];       //发送数组
    uint8_t Txd_len;            //发送长度
    uint8_t Txd_F;              //发送标志位
    
    void Send(uint8_t dat)
    {
      while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
        UART1_SendData8(dat);
    }
    uint8_t Set_UART1Interrupt(uint8_t *lV_dat,uint8_t lV_len)
    {
      if(Txd_len != 0)
      {
        return FALSE;
      }
      
      for(Txd_len=0;Txd_len <lV_len;Txd_len++)  //将数据装到全局变量中
        Txd_buf[Txd_len]=lV_dat[Txd_len];
      
      UART1_ITConfig(UART1_IT_TC, ENABLE);       //使能发送中断  
      return TRUE;
    }
    

     

    5.编写主函

    void main(void)  
    {
      CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);    //内部时钟16M
      Init_UART1();
      enableInterrupts();
      UART1_Send("Hi\n",3);                //查询发送
      Set_UART1Interrupt("Hello\n",6);     //中断发送数据
      while(1);
    }
    

     

    6.编写中断服务函数

     INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
     {
      static uint8_t lV_num;              //记录已经发送数据的长度
      
      Send(Txd_buf[lV_num++]);
      if(lV_num == Txd_len)                      //发送数据的长度和需要发送数据的长度相等  就关闭发送中断
      {
        lV_num = 0;
        (void) memset(Txd_buf,0,Txd_len);
        Txd_len = 0;
        UART1_ITConfig(UART1_IT_TC, DISABLE);       //禁止发送中断  
      }
      return; 
     }
    

     

    展开全文
  • STM32串口中断的方式发送

    万次阅读 多人点赞 2018-12-06 10:38:30
    我将其改为真正的中断发送。 步骤一:初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //LED1-PC10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_...
  • STM32 串口中断总结

    万次阅读 多人点赞 2017-12-25 17:03:17
    本文以USART1为例,叙述串口中断的编程过程。 1、先来讲述一下在应用串口中断时涉及到的一些库文件。 首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。 接下来就是我们要用到的相关...
  • 1、配置GPIO4为中断输入,GPIO5为输出。 2、中断接收代码: #define RECVSIZE 50 #define SET_GPIO5_HIGH GPIO_SetPins(GPIO_PIN_5); #define SET_GPIO5_LOW GPIO_ResetPins(GPIO_PIN_5); unsigned char receive...
  • stm32串口中断通信,实现上位机控制开始发送和停止发送一、准备工作二、程序编写三、效果展示 一、准备工作 本文所使用的硬件设备为野火的指南者开发板,利用商家提供的例程完成串口的中断通信。 所要实现的功能为...
  • STM32串口发送中断

    2018-03-01 21:18:00
    今日进行串口数据通信时,使用DMA串口485发送完成中断进行485发送至接收的状态转换时发现,当DMA传输完成时,串口发送寄存器中的数据还未通过发送端口传输完成,在中断中需等待查询串口发送的状态,while((USART_...
  • 51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2
  • 有人问过这个问题: “用串口中断接收比较好理解,只要接收缓存接收到数据,标志位就会置位,然后进入中断服务程序读取接收缓存中的数据,但是在发送时,应该是在数据发送出去之后发送标志位才会... 中断发送方式...
  • 想写一个串口中断,在输入一些值的时候能跳入中断响应, 中断标志位,子中断标志位,中断屏蔽位,子中断屏蔽位都有定义, 在串口输入一些值后,能显示进入了中断并且能读到, 但是会一直循环进入串口中断, SRCPND1 ...
  • STM32串口DMA发送中断配置

    千次阅读 2019-06-15 14:20:19
    本文以STM32F1xx的串口1为例,简单呈现下使用DMA中断连续发送的代码 串口DMA配置通常可以分为2个部分: 1.串口配置 2.DMA配置 串口配置 void UART1_Init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; USART_...
  • 串口中断方式的发送过程是怎么回事? 有人问过这个问题: “用串口中断接收比较好理解,只要接收缓存接收到数据,标志位就会置位,然后进入中断服务程序读取接收缓存中的数据,但是在发送时,应该是在数据...
  • 初始化后,用了自创的printf,结果串口助手软件显示不出字符来。但实际显示了接收的字符个数。 用hex显示一看。原来多了一个0x00. 然后只是初始化,不用printf。果然发送了一个0x00. 网上查了一下,有这些说法: ...
  • 发送和接收两个函数  /*##-2- Start the transmission process #####################################*/  /* While the UART in reception process, user can transmit data through   "aTxBuffer"...
  • C51串口中断接收和发送程序

    千次阅读 2010-12-12 21:13:00
    //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收  //和查询发送,另外我觉得发送没有必要用中断 <br />#include <reg51.h><br />#include <string.h><br /> #...
  • stm32串口中断与外部中断

    千次阅读 2020-03-06 12:39:58
    1.按照芯片参考手册设置串口引脚属性和外部中断引脚属性,并且根据实际电路设置GPIO工作状态,注意在NVIC中还要打开串口中断与外部中断。 2.main.c头文件中定义串口中断的接收数组与接收标志等 3.main.c中main...
  • 关于是否在串口中断服务程序中 是否加清除标志位操作. 手册有说明 正常的读写DR寄存器都能达到清楚标志的效果.所以除了多缓存通信的情况下,没必要增加清除标志位. 两个清除函数.USART_ClearFlag清除...
  • 没有用DMA,就是想单纯的使用发送中断来数据,结果在调试的时候一直死在了串口中断那里,然后查看sr寄存器,发现是TC位只要打开发送中断就会被置位,看到这里我嘴角微微上扬,轻蔑一笑,(ˉ▽ ̄~) 切~~清掉标志位就...
  • HAL库串口一直发送进入不进中断BU

    千次阅读 2019-06-16 20:19:45
    这个问题前两个月就碰到了,一直没有记载,再次记载一下。 问题复现: ... 发送周期是20ms,但发送一段时间后,不进入串口中断。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart...
  • 串口接收/发送有三种模式:中断、轮询、DMA,轮询方式并不推荐,也不经常使用,这里主要看的是中断和DMA方式。 中断串口触发中断两种方式:RXNE、IDLE,一种是接收到一个数据接中断一次,一种是等待数据发送...
  • 串口中断服务函数

    千次阅读 2020-03-02 16:55:17
    串口中断服务函数详解 void USART1_IRQHandle(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_Receive...
  • 中断方式串口发送实现思路

    千次阅读 2014-04-24 19:24:38
    中断方式串口发送实现思路  |举报|字号 订阅 如题,我项目里的中断方式串口发送工作得很好。尤其是对实时性要求较高且数据量较大且发送频繁时,优势较循环查询式不言而喻。 具体思路是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,804
精华内容 13,121
关键字:

串口中断发送