我用的芯片是STM32F405 在主函数之前定义了一个3字节数组 uint8_t uart_receive[3]={0}; uint16_t uart_len =3; uint8_t *uart_recv =(uint8_t *)&uart_receive; 在主函数里启动UART中断 HAL_UART_Receive_IT(&huart2,uart_recv, uart_len);//开接收中断 while(1); 在接收中断中向上位机发送接到的数据一次发3字节 (1)第一种方式上位机接到的数据不准确 void USART2_IRQHandler(void) {HAL_UART_Transmit(&huart2,uart_recv, uart_len,10); HAL_UART_IRQHandler(&huart2);} 发送bb,接到00 00 00 再发送bb,接到bb 00 00 再发送bb,接到bb bb 00 (2) 第二种接到的数据正确 void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); HAL_UART_Transmit(&huart2,uart_recv, uart_len,10);} 发送bb,接到bb 00 00 再发送bb,接到bb bb 00 再发送bb,接到bb bb bb 所以中断里HAL_UART_IRQHandler(&huart2);运行完之后, 数组uart_receive才会被赋与接收到的值 环境:STM32CUBEMX,MDK-4 硬件:STM32F405RGTx,LQFP64封装 UART1:A9和A10 |
STM32F405.rar
下载6.72 MB, 下载次数: 17, 下载积分: ST金币 -1
STM32CUBEMX,UARTå®éª
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
楼主个人觉得这样接收数据可能是不对的。如果你的确想收到三个数再中断或者时间到了再中断,你的中断处理函数最好用HAL_UART_RxCpltCallback()来处理。
而且既然要用中断,那你就要考虑中断怎么用。硬件上每接收到一帧数据就触发一次中断,那么官方的库函数如果还让你每次中断就处理一下数据那意义就不打了。在终端处理函数那里国防接管了简单的数据处理。你倒是可以添加一些触发标识计数之类的。
另外还有这样一条函数HAL_UART_RxHalfCpltCallback()能想到它的意思吗。若用F可以看看UM725,其他系列也有。你自己找一下吧
评分
查看全部评分