CH32V103c8t6 在寻找解决接收完数据后,怎么即时判断数据已经完成了接收。发现串口有一个IDLE空闲中断。如下图描述:

意思是在串口接收完一帧数据 会产生一个中断,此时程序可判断为数据已接收完毕。

测试例程如下:

一、串口初始化:

  1. void User_USART_Init(uint32_t baudrate)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStructure;
  4. USART_InitTypeDef USART_InitStructure;
  5. NVIC_InitTypeDef NVIC_InitStructure;
  6.  
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  9.  
  10. /* USART2 TX-->A.2 RX-->A.3 */
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  14. GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.  
  16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  19. GPIO_Init(GPIOA, &GPIO_InitStructure);
  20.  
  21. USART_InitStructure.USART_BaudRate = baudrate;
  22. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  23. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  24. USART_InitStructure.USART_Parity = USART_Parity_No;
  25. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  26. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  27.  
  28. USART_Init(USART2, &USART_InitStructure);
  29.  
  30. /*打开串口中断*/
  31. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  32.  
  33. /*打开IDLE数据检测中断*/
  34. USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
  35.  
  36. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  37. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  38. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  39. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  40. NVIC_Init(&NVIC_InitStructure);
  41.  
  42. USART_Cmd(USART2, ENABLE);
  43. USART_SetAddress(USART2, 0x1);
  44.  
  45. }

 二、串口中断程序

  1. /*idle 数据检测中断测试*/
  2. void USART2_IRQHandler(void)
  3. {
  4. uint16_t Clear = Clear;
  5.  
  6. /*如果接收到一个字节*/
  7. if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)
  8. {
  9. USART_RX_BUF[RxCounter++]= USART_ReceiveData(USART2);
  10. }
  11. /*如果接收到一帧数据*/
  12. else if(USART_GetITStatus(USART2, USART_IT_IDLE)!= RESET)
  13. {
  14. Clear = USART2->STATR;
  15. Clear = USART2->DATAR;
  16.  
  17. strcpy(UsartData,USART_RX_BUF);
  18.  
  19. /*清空串口接收数组*/
  20. memset(USART_RX_BUF, 0, sizeof (USART_RX_BUF));

         /*重置接收数组指针*/
  21. RxCounter = 0;
  22. USART_RX_STA = 1;
  23.  
  24. }
  25.  
  26. }

 三、测试接收效果:将收到数据原路发回

  1. if(USART_RX_STA == 1)
  2. {
  3.  
  4. USART_Send_String(USART2,UsartData);
  5. memset(UsartData, 0, sizeof (UsartData));
  6. USART_RX_STA = 0;
  7. }

  

  

【单片机】CH32V103串口IDLE空闲中断的更多相关文章

  1. Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据

    串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...

  2. 2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    上一篇链接 http://www.cnblogs.com/yangfengwu/p/8628219.html 先说明一点这种方式,不光对于单片机类的,,对于上位机接收数据同样适用----不骗人的,自己 ...

  3. 串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)

    1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后, ...

  4. 串口1配合DMA接收不定长数据(空闲中断+DMA接收)

    1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后, ...

  5. STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率

    前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...

  6. 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于... ...

  7. 关于STM32空闲中断

    有一次做一个东西,为了尽量不占用CPU的处理数据时间,所以就使用DMA接收串口的数据,但是呢问题来了.,,,,,怎么样才能确定接收到了一条完整的数据了,,我们都知道只要打开DMA 那家伙就不停的把接收 ...

  8. MM32F0140 UART1空闲中断接收

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1空闲中断和NVIC中断 3.编写MM32F0140 UART1中断接收和空闲中断函数 4.编写MM32F0140 UART1 ...

  9. MM32F0020 UART1空闲中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1空闲中断和NVIC中断 3.编写MM32F0020 UART1中断接收和空闲中断函数 4.编写MM32F0020 UART1 ...

随机推荐

  1. 结合CSS3的布局新特征谈谈常见布局方法

    写在前面最近看到<图解CSS3>的布局部分,结合自己以前阅读过的一些布局方面的知识,这里进行一次基于CSS2.3的各种布局的方法总结. 常见的页面布局 在拿到设计稿时,作为一个前端人员,我 ...

  2. vue全家桶+axios+jsonp+es6 仿肤君试用小程序

    vue全家桶+axios+jsonp+es6 仿肤君试用小程序 把自己写的一个小程序项目用vue来实现的,代码里面有一些注释,主要使用了vue-cli,vue,vuex,vue-router,axoi ...

  3. c++类调用的一个小问题

    先看这两段代码: #include <iostream> #include <vector> #include <algorithm> using namespac ...

  4. CSS简单样式练习(二)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  5. Static in C++

    Static in C++ static根据上下文会有两种含义,他们的区别如下 **在类class或者是在结构体struct 外 **使用static 类外的static修饰的符号在link阶段是局部 ...

  6. 文档——STM32F10中文参考手册

    ST官方免费的资料.进入官方,第一个就是. 大家不用在CSDN付费下载了!!!!. (https://www.stmcu.org.cn/document/list/index/category-158 ...

  7. Python入门-pip模块管理工具

    安装 # 在线安装 pip install <包名> 安装后,该模块文件会在安装python环境目录:lib/packages目录下 # 安装本地安装包 pip install <目 ...

  8. 利用 onnxruntime 库同时推理多个模型的效率研究

    1. 背景 需求:针对视频形式的数据输入,对每一帧图像,有多个神经网络模型需要进行推理并获得预测结果.如何让整个推理过程更加高效,尝试了几种不同的方案. 硬件:单显卡主机. 2. 方案 由于存在多个模 ...

  9. 华为组播实验,PIM-DM组播实验

    一.配置VLAN,并将端口加入VLAN LSW5: system vlan batch 10 to 100 int g 0/0/1 port link-type trunk port trunk al ...

  10. Java学习day27

    今天跟着做了一个模拟龟兔赛跑的程序 只有一条赛道,乌龟和兔子在同一条赛道上比赛,使用了多线程 为了实现兔子睡觉,在run方法内增加了当前奔跑者是否是兔子的判断且当前奔跑步数是否是10的整数倍的判断,如 ...