板子型号:STM32G431
使用软件:CUBEMX
思路:定时器中断控制串口不定长接收
1ms定时器扫描,每次接收到1个符号就开始计时35ms,不断的接收可以重复写入35ms。
接收不到时,等待35ms,就置结束符号为1,进行串口发送。
一、CUBEMX设置
PS:用cubemx主要是因为想偷懒,省略掉一些初始化配置。

USART1:

TIM3:

二、代码部分
1.定义
代码如下:
typedef union{
struct{
uint8_t receiveyes:1; //确认接收符号
uint8_t receiveend:1; //结束接收符号
}FlagStatus;
uint8_t count;
}Bitvar;
Bitvar sign;
unsigned char time;
uint16_t rdata[50];//最终接收数据存放
uint16_t Rxbuff[1];//接收一个字符
2.定时器回调函数
代码如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(sign.FlagStatus.receiveyes==1){ //如果接收到了
if(time>0){time--;}
if(time==0){
sign.FlagStatus.receiveyes=0;
sign.FlagStatus.receiveend=1; //接收不到,符号位置一
time=35;
}
}
}
3.串口接收回调函数
代码如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
rdata[sign.count++]=Rxbuff[0];
sign.FlagStatus.receiveyes=1; //接收到了
time=35; //喂time为35
HAL_UART_Receive_IT(&huart1, (uint8_t *)Rxbuff, 1);
}
}
4.while循环
while (1)
{
HAL_UART_Receive_IT((UART_HandleTypeDef *)&huart1, (uint8_t *)Rxbuff, 1);
if (sign.FlagStatus.receiveend==1){ //发现接收结束了
sign.FlagStatus.receiveyes=0;
sign.FlagStatus.receiveend=0;
HAL_UART_Transmit((UART_HandleTypeDef *)&huart1, (uint8_t *)rdata, 50, 999);
memset(rdata,0,sizeof rdata);
sign.count=0; //下次接收,从0开始
}
}
三、最终效果

看到这里了,点个赞呗!

本文介绍了一种利用STM32G431的CUBEMX配置,通过1ms定时器中断控制串口不定长接收的方法。当接收到1个字符后启动35ms计时,若在该时间内未接收到新的字符则发送结束信号。主要涉及定时器和串口的设置及中断回调函数的编写。
56

被折叠的 条评论
为什么被折叠?



