你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口空闲中断+DMA。第二次接收长度为0

[复制链接]
叶默12 提问时间:2023-11-8 17:19 / 未解决
收藏 评论5 发布时间:2023-11-8 17:19

举报

5个回答
xmshao 回答时间:2023-11-8 17:34:27
基本锁定代码方面问题,就这么一句话,旁人只有浓浓的无力感!
网上不少类似案例分享,稍微比较下。 如果使用ST库的话,
注意你的第二次是否真的发送了,里面有些类似gState状态机
的变量,看看是否在ready状态。
叶默12 回答时间:2023-11-8 17:39:04

HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情况下可以正常接收,包含接收个数第二次也正常。如果使用DMA发送就会导致第二次接收长度为0,接收DMA配置为一般模式,发送DMA循环模式。接收串口在自定义回调函数中重新开启了DMA串口接收。 在测试过程中仅更改了串口发送方式,DMA(非阻塞)和阻塞发送。不理解为什么串口发送影响了串口接收。

HAL_UART_Transmit(&huart3 ,USART3_Struct.rxbuf, 16 , 10);

HAL_UART_Transmit_DMA(&huart3 ,USART3_Struct.rxbuf, 16);

void USR_UART_IdleRxCpltCallback(UART_HandleTypeDef *huart) { if( huart->Instance == USART3) { if ( USART3_Struct.Busyflag == 0 ) { USART3_Struct.usart3_rxbuf_len = rxbuffsize - (__HAL_DMA_GET_COUNTER(&hdma_usart3_rx));//接收个数 if( USART3_Struct.usart3_rxbuf_len != 16 )//判断接收数据长度是否正常,如果异常就回复数据长度错误 { //长度错误 } if(USART3_Struct.usart3_rxbuf_len==16)//数据长度正常,未处于解析命令状态 { //拷贝数组 for(uint8_t i=0; i < USART3_Struct.usart3_rxbuf_len ;i++) { USART3_Struct.rxbuf[i]=USART3_Struct.usart3_rxbuf[i];//将收到的数组放到解析缓存数组里去 } //主函数轮询标志位->解析数据缓存Buf memset(USART3_Struct.usart3_rxbuf , 0x00 , USART3_Struct.usart3_rxbuf_len);//清空DMA接收缓冲区 } HAL_UART_Receive_DMA(&huart3, USART3_Struct.usart3_rxbuf , rxbuffsize);//重新开启DMA USART3_Struct.Rxflag = 1;//接收完成标志位 USART3_Struct.Busyflag = 1; //正在解析标志位 }

}

叶默12 回答时间:2023-11-8 17:42:43

xmshao 发表于 2023-11-8 17:34
基本锁定代码方面问题,就这么一句话,旁人只有浓浓的无力感!
网上不少类似案例分享,稍微比较下。 如果使 ...

HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情况下可以正常接收,包含接收个数第二次也正常。如果使用DMA发送就会导致第二次接收长度为0,接收DMA配置为一般模式,发送DMA循环模式。接收串口在自定义回调函数中重新开启了DMA串口接收。 在测试过程中仅更改了串口发送方式,DMA(非阻塞)和阻塞发送。不理解为什么串口发送影响了串口接收。HAL_UART_Transmit(&huart3 ,USART3_Struct.rxbuf, 16 , 10);HAL_UART_Transmit_DMA(&huart3 ,USART3_Struct.rxbuf, 16);
watershade 回答时间:2023-11-9 11:25:53

叶默12 发表于 2023-11-8 17:39
HAL库,自定义空闲中断回调,在串口中断服务函数中调用。在其他位置进行发送接收数组(阻塞),这种情 ...

[md]应该不会有影响。idle中断可以不用自定义,建议使用新函数HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)

看看是不是你的代码在ISR中将DMA停止了

butterflyspring 回答时间:2023-11-9 17:17:47
watershade 发表于 2023-11-9 11:25
[md]应该不会有影响。idle中断可以不用自定义,建议使用新函数`HAL_StatusTypeDef HAL_UARTEx_ReceiveToI ...

在接收中断里,如果DMA是normal 模式,看起来是停掉了。
可以在回调函数里接着再使能。



楼主可以再调试一下,看看是不是这么回事。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版