完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先介绍一下实验环境:单片机为STM32f415
调试器:st-link 硬件初始化: *串口波特率为614400 *采用定时器每隔500us触发一次串口中断发送 *发送完成后进入中断接收模式 定时器中断回调函数如下: void HAL_tiM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==&htim14) { GYRO_Handle.cmd_GYRO=GYRO_CMD; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); 使能发送 HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1); 开启中断发送,然后进入发送模式 } } 发送完成后进入发送中断完成回调函数: void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart3) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); 使能接收 HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7); 开启中断接收,然后进入接收模式 } } 接收中断完成回调函数: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart3) { 用户函数区域 } } 实验结果: 发送没有问题,可成功发送。 接收只能收到第一个字节。 接收服务函数老是进入错误服务函数,错误号为数据溢出 已经分析两天了,还是没有找到问题,求大师分析。 |
|
相关推荐
40个回答
|
|
|
|
|
|
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HAL_UART_Transmit_IT之前。
|
|
|
|
你我然后 发表于 2018-11-26 15:14 改后如下 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==&htim14) { GYRO_Handle.cmd_GYRO=GYRO_CMD; HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1); } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart==&huart3) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); } } 还是进入错误中断,无法进入接收完成中断 |
|
|
|
|
|
|
|
|
|
|
|
通信距离有多远?用max3232?
|
|
|
|
本帖最后由 党国特派员 于 2015-1-16 11:40 编辑
HAL_UART_Receive_IT 只需要调用一次。 还有就是你的接收函数里都干了些什么,会不会时间超长了。 |
|
|
|
如果 是还出现数据溢出的话,那你就用HAL_UART_Receive_DMA吧,最好是双缓冲的。
|
|
|
|
用户函数区处理时间太长
|
|
|
|
本帖最后由 damiaa 于 2015-1-16 13:37 编辑
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); 使能接收 这个IO和时间搭配问题吧。 用232试试。或者只接收。IO搞个低 死的 ? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
接收回调只是加了一个标志位,没干别的 |
|
|
|
|
|
|
|
ke3978 发表于 2018-11-26 17:09 设备在收到我的指令50us后才会发数据的。我感觉不是因为使能脚的问题 |
|
|
|
|
|
|
|
我想是:在规定时间里中断里发送肯定正常发送,之后到接受中断里,由于你的发送时间太短,中断有优先级,建议可惜在发送中断时间放大点和接受程序减少放中断里。个人意见,仅供参考。
|
|
|
|
LZ在调陀螺仪么~~~
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
6014 浏览 1 评论
3031 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1325 浏览 0 评论
3869 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3704 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-12 09:32 , Processed in 0.846759 second(s), Total 74, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191