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

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

测试例程如下:

一、串口初始化:

void User_USART_Init(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* USART2 TX-->A.2 RX-->A.3 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStructure); /*打开串口中断*/
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /*打开IDLE数据检测中断*/
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2, ENABLE);
USART_SetAddress(USART2, 0x1); }

 二、串口中断程序

/*idle 数据检测中断测试*/
void USART2_IRQHandler(void)
{
uint16_t Clear = Clear; /*如果接收到一个字节*/
if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)
{
USART_RX_BUF[RxCounter++]= USART_ReceiveData(USART2);
}
/*如果接收到一帧数据*/
else if(USART_GetITStatus(USART2, USART_IT_IDLE)!= RESET)
{
Clear = USART2->STATR;
Clear = USART2->DATAR; strcpy(UsartData,USART_RX_BUF); /*清空串口接收数组*/
memset(USART_RX_BUF, 0, sizeof (USART_RX_BUF));

     /*重置接收数组指针*/
RxCounter = 0;
USART_RX_STA = 1; } }

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

	    if(USART_RX_STA == 1)
{ USART_Send_String(USART2,UsartData);
memset(UsartData, 0, sizeof (UsartData));
USART_RX_STA = 0;
}

  

  

最新文章

  1. nginx 虚拟主机配置
  2. mysql基础用法
  3. loadrunner录制脚本方式笔记
  4. 变量声明提升 Vs. 函数声明提升
  5. 使用Excel制作万年历(可打印)
  6. StreamReader和StreamWrite和FileStream区别和用法
  7. 关于优化sql查询的一个方法。
  8. copy构造函数的秘密
  9. 小黄豆CRM软件安装
  10. js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法
  11. delphi 2010 动态链接库DLL断点调试
  12. git使用图解
  13. 初次接触 Android Studio FAQ
  14. sql中关于存在就不做操作的代码块
  15. instanceof 操作符实现原理解析
  16. js 浏览器 宽高 各种
  17. 1.13.Mark1
  18. PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
  19. OpenStack概念架构简述
  20. mysql好用的函数

热门文章

  1. html5网页录音和语音识别
  2. 首次写iPad布局感想(H5)
  3. 让我为你介绍一个神器:Chimee,一套可扩展的 H5 视频播放器解决方案
  4. 申请百度翻译API
  5. 使用nmtui命令解决network-scripts目录下无网卡对应配置文件问题
  6. 巧用 background-clip 实现超强的文字动效
  7. Python自动批量修改服务器密码
  8. maven jar包冲突问题
  9. 【图文教学】如何轻松下载tiktok上的视频
  10. 【面试普通人VS高手系列】CPU飙高系统反应慢怎么排查?