最近搞串口接收完整的数据帧,虽然很早就接触串口,但是工作上用还是会遇到不少问题。串口收包过程,首先要解决的问题就是要保证接收到完整的数据包,参考网上的串口收包方法,多数是使用定时器做超时判断,又或者加DMA之类的,考虑到我的串口只是做小数据量收发(收发指令),要额外使用一个定时器,就太复杂了。查资料过程中发现了串口空闲中断,故想空闲中断来接收串口数据帧。以下是空闲中断的参考demo:
主函数 main.c
/**
******************************************************************************
* @file main.c
* @author Lewis
* @version V1.0
* @date 2019-12-18
* @brief 调试函数PR的Demo
******************************************************************************
* @attention
* Software Truestudio for STM32
*/
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_GeneralTim.h"
#include "string.h"
extern unsigned char data_buffer[256];
extern unsigned char rx_done;
extern unsigned char rx_cnt;
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
unsigned char i = 0;
USART_Config(); // USART1 115200 8-N-1
// GENERAL_TIM_Init();
PR("IEM init done...\r\n");
// 开定时器
// TIM_Cmd(GENERAL_TIM, ENABLE);
while(1)
{
if( rx_done == 1 )
{
rx_done = 0;
PR("UART RX done...\r\n");
PR("rx_cnt = %d.\r\n",rx_cnt);
for( i = 0; i < rx_cnt; i++ )
{
PR( "data_buffer[%d] = 0x%x\r\n", i, data_buffer[i] );
}
// 清空数组
memset( data_buffer, 0x00, rx_cnt );
PR("---------------------------\r\n");
for( i = 0; i CR1 |= (1<CR1 &= ~(1<CR1 &= ~(1<DR;
// 复位状态机
state = STATE_READY;
}
}
测试:
hex 发送 11 22 33 44 55 66
[10:27:18.672]发→◇"3DUf□
[10:27:18.675]收←◆UART RX done...
rx_cnt = 6.
data_buffer[0] = 0x11
data_buffer[1] = 0x22
data_buffer[2] = 0x33
data_buffer[3] = 0x44
data_buffer[4] = 0x55
data_buffer[5] = 0x66
---------------------------
data_buffer[0] = 0x0
data_buffer[1] = 0x0
data_buffer[2] = 0x0
data_buffer[3] = 0x0
data_buffer[4] = 0x0
data_buffer[5] = 0x0
UART1 reopen done.
参考:
利用stm32串口空闲中断接收不定长数据
http://www.eemaker.com/stm32-uart-budingchangshuju.html