Exp3_USART1_Transmit_VariableLengthReceive_IT__简明指导文件
编程实现主动发送中断接收,变长度串行通信
在固定位置添加程序:
/* USER CODE BEGIN PV */
__IO ITStatus Uart1_Ready_R = RESET;
uint8_t aRxBuffer[1]; //aRxBuffer必须定义为数组
uint8_t RxBuffer[100];
uint8_t Rx_count_UART1=0;
uint8_t Rx_Num_UART1=0;
/* USER CODE END PV */
/* USER CODE BEGIN WHILE */
HAL_UART_Receive_IT(&huart1,aRxBuffer,1); //启动中断方式接收
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while(Uart1_Ready_R==RESET); //等待一帧数据接收完毕
Uart1_Ready_R=RESET; //将接收标志复位
HAL_UART_Transmit(&huart1,RxBuffer,Rx_Num_UART1,10); //发送数据
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(10);
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance == USART1) //首先判断是否是USART1的中断
{
RxBuffer[Rx_count_UART1] = aRxBuffer[0]; //保存接收到的数据
//判断是否已经接收到回车(0x0D)和换行(0x0a)
if((RxBuffer[Rx_count_UART1-1] == 0x0D)&&(RxBuffer[Rx_count_UART1] == 0x0A))
{
//将接收置为SET(=1),以回车换行为结束标志的一帧数据接收完毕
Uart1_Ready_R = SET;
Rx_Num_UART1 = ++Rx_count_UART1; //统计接收到的数据个数
Rx_count_UART1 = 0; //接收数据计数器清零
}
else Rx_count_UART1++; //如果还没有到回车换行,则接收数据计数器+1
HAL_UART_Receive_IT(&huart1,aRxBuffer,1); //启动下一次接收
}
}
/* USER CODE END 4 */
运行结果:
计算机每发送一次数据给STM32F107,接收到数据后,将接收到的数据发送给计算机,LED改变一次亮灭状态。