使用串口中断接收时遇到的小问题(单字节接收,固定多字节接收,不定长字节接收)

 

单字节接收

在cubemx初始化串口1,打开串口中断

在usart。c文件中修改中断回调函数

 

//串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if( huart == &huart1)//判断中断源
{
    if(g_ucUsart1ReceiveData == 0x01) 
    {
        
    }
if(g_ucUsart1ReceiveData == 'A') 
    {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    }
if(g_ucUsart1ReceiveData == 'C') 
    {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
    }
if(g_ucUsart1ReceiveData == 'D') 
    {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
    }
if(g_ucUsart1ReceiveData == 'E') 
if(g_ucUsart1ReceiveData == 'F') 
if(g_ucUsart1ReceiveData == 'G') 
    HAL_UART_Receive_IT( &huart1, &g_ucUsart1ReceiveData, 1);//继续进行中断接收
}
}

对接受到指令数据赋值给g_ucUsart1ReceiveData,然后判断指令,执行指令。

但当程序实际使用时,会发现在实际执行的时候它只执行了一次,第二次发同样的指令都没有反应了,只有第一次有反应,出现了此问题开始寻找问题根源,

eg1.比如指令A,每发一次应该反转当前状态,发第一次A成功反转,但第二次就没反应了

19e31df3fc364a6181528add75320e09.png85051814c8db4a5e9a9d8cbfca8cd734.png                      5b42786ffe384b81b9be47342ec30d45.png

后面发送连这个发、函数返回值都没有,printf也不执行了

eg2.又比如发指令C,第一次发送强制拉高,第二次发D却不强制拉低了

 

这里利用上述线索做出以下推断

1.可能是g_ucUsart1ReceiveData的值没有改变的原因,无论发什么g_ucUsart1ReceiveData仍然是之前的(eg.2能说通但eg.1却不行,因为光光只是如果这样eg1也应该每次反转啊,也就是第二次更不不会执行这几句话)

2.二次后压根没进入中断了,因为后面发送连这个发、函数返回值都没有,printf也不执行了,综上大概率是第一次进入中断后的问题,第二次就没进去过了,(程序没有卡死,只是单纯的静不了串口中断了)

早上2的可能性最大

解决办法:

//串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if( huart == &huart1)//判断中断源
{
    if(g_ucUsart1ReceiveData == 0x01) 
    {
        
    }
if(g_ucUsart1ReceiveData == 'A') 
    {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    }
if(g_ucUsart1ReceiveData == 'C') 
    {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
    }
if(g_ucUsart1ReceiveData == 'D') 
    {
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
    }
if(g_ucUsart1ReceiveData == 'E') 
if(g_ucUsart1ReceiveData == 'F') 
if(g_ucUsart1ReceiveData == 'G') 
    g_ucUsart1ReceiveData=0x00;
    HAL_UART_Receive_IT( &huart1, &g_ucUsart1ReceiveData, 1);//继续进行中断接收
}
}

c6e3efadaab94270b36001bd11aec286.png

主要添加了红色部分,每次最后要对g_ucUsart1ReceiveData清0,所以最后可以发现问题,就是

g_ucUsart1ReceiveData的管理不到位,是的后面的HAL_UART_Receive_IT错误处理,下次进入中断失败

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值