HK32F103CBT6 USART串口接收数据丢包问题

 收到的数据头尾是对的,就是数据错位,有时还少收。

这种原因,首先头0xFA 数据正常,表示波特率是正常的,其原因是程序执行的时候有事件打断接收函数

处理方法一,把串口的中断优先级调到最高 0

 

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; 	   // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;	  	// 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	   // 设置子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
	

 

处理方法二,用DMA接收串口数据

void usart2_receive(void)
{
	uint16_t buff_length;
	
	buff_length=DMA_GetCurrDataCounter(DMA1_Channel6);/* 获取接收到的数据长度 单位为字节*/
	DMA_Cmd(DMA1_Channel6, DISABLE);  					   /* 暂时关闭dma,数据尚未处理 */ 
	USART2_data.USART_LEN = USART2_TEMP_LEN -(u16)buff_length;        					 /* 获取数据长度 */
	DMA_ClearFlag(DMA1_FLAG_TC6);  /* 清DMA标志位 */         
	DMA_SetCurrDataCounter(DMA1_Channel6,USART2_TEMP_LEN);/* 重新赋值计数值,必须大于等于最大可能接收到的数据帧数目 */	
	
//	usart2_RX_data[RX2]=USART2_data;
	USART2_task(&USART2_data);
	
	DMA_Cmd(DMA1_Channel6, ENABLE);      				  /*打开DMA*/
}

HK的串口空闲中断启动有点问题,需要先用读取中断,再转换成空闲中断 

if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET) //空闲中断触发
	{		
		//接收数据
  	usart2_receive();                              //取出接收数据包并处理函数
		USART_ReceiveData(USART2);   //清除空闲中断标志位(接收函数有清标志位的作用)
		USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);   //关闭空闲中断
		USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);    //开启读取中断
	}
	else if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET) //空闲中断触发
	{
		usart2_receive(); 
		USART_ReceiveData(USART2); //清空标志		
	}else
	{
		USART_ReceiveData(USART2);   //清除空闲中断标志位(接收函数有清标志位的作用)
		USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);   //开启空闲中断
		USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
	}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103CBT6是一款32位的ARM Cortex-M3内核微控制器,具有丰富的外设功能,括多个串口模块。下面是一个基本的串口程序示例,用于在STM32F103CBT6上使用串口进行数据通信。 首先,需要在代码中含适当的头文件,例如: ```c #include "stm32f10x.h" ``` 然后,需要进行串口的初始化设置。假设使用USART1作为示例。 ```c void USART1_Init(void) { // 打开USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; // 设置波特率为9600 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位长度为8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位为1位 USART_InitStructure.USART_Parity = USART_Parity_No; // 无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 同时使能接收和发送 USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } ``` 接下来,可以编写一个简单的发送函数: ```c void USART1_SendChar(uint8_t data) { // 等待发送寄存器为空 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 发送数据 USART_SendData(USART1, data); } ``` 最后,可以实现一个接收函数: ```c uint8_t USART1_ReceiveChar(void) { // 等待接收缓冲区非空 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); // 读取接收到的数据 return USART_ReceiveData(USART1); } ``` 使用这些函数,就可以在STM32F103CBT6上进行串口通信了。例如,发送一个字节的数据可以使用`USART1_SendChar`函数: ```c USART1_SendChar('H'); ``` 接收一个字节的数据可以使用`USART1_ReceiveChar`函数: ```c uint8_t data = USART1_ReceiveChar(); ``` 这个串口程序示例只是一个基本的框架,可以根据实际需要进行修改和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值