单字节接收
在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成功反转,但第二次就没反应了
后面发送连这个发、函数返回值都没有,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);//继续进行中断接收
}
}
主要添加了红色部分,每次最后要对g_ucUsart1ReceiveData清0,所以最后可以发现问题,就是
g_ucUsart1ReceiveData的管理不到位,是的后面的HAL_UART_Receive_IT错误处理,下次进入中断失败